Как вы справляетесь с keyboardDidShow в нескольких представлениях?

У меня есть приложение, в котором я добавляю новый элемент в представление таблицы, когда пользователь нажимает кнопку редактирования, которая показывает ячейку текстового поля внизу таблицы, аналогично встроенному приложению «Уведомления». Мне нужно настроить таблицу, когда отображается клавиатура, чтобы она не мешала, когда в таблице много строк. Я делаю это, подписываясь на уведомление, когда клавиатура показывает:

- (void)viewDidLoad
{
    [super viewDidLoad];

    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector (keyboardDidShow:)
                                                 name: UIKeyboardDidShowNotification
                                               object:nil];

    [[NSNotificationCenter defaultCenter] addObserver:self 
                                             selector:@selector (keyboardDidHide:)
                                                 name: UIKeyboardDidHideNotification
                                               object:nil];
}

...
...

-(void) keyboardDidShow: (NSNotification *)notif 
{
    // If keyboard is visible, return
    if (self.keyboardVisible) 
    {
        return;
    }

    // Get the size of the keyboard.
    NSDictionary* info = [notif userInfo];
    NSValue* aValue = [info objectForKey:UIKeyboardFrameBeginUserInfoKey];
    CGSize keyboardSize = [aValue CGRectValue].size;

    // Adjust the table view by the keyboards height.
    self.tableView.contentInset =  UIEdgeInsetsMake(0, 0, keyboardSize.height, 0);
    NSIndexPath *path = [NSIndexPath indexPathForRow:self.newsFeeds.count inSection:0];
    [self.tableView scrollToRowAtIndexPath:path atScrollPosition:UITableViewScrollPositionTop animated:YES];
    self.keyboardVisible = YES;
}

Однако таблицу, в которую я разрешил пользователю добавить строку, также можно коснуться, и новое представление будет отправлено в приложение. Это представление также имеет текстовое представление, и когда пользователь нажимает на него, а клавиатура показывает, что первый контроллер представления все еще получает уведомление, что вызывает сбой.

Как я могу игнорировать уведомление или заставить его не срабатывать при нажатии нового представления?


person lehn0058    schedule 15.09.2012    source источник
comment
Вы можете добавить класс в качестве наблюдателя в viewDidAppear и удалить его в viewWillDisappear.   -  person InsertWittyName    schedule 16.09.2012
comment
Я пробовал удалить с именем ранее, и это вызвало исключение, хотя я не совсем уверен, почему...   -  person lehn0058    schedule 16.09.2012
comment
Я понял, почему это не работает. Я случайно назвал [self viewWillDisappear:animated]; вместо [super viewWillDisappear:animated]; что поставило меня в бесконечный цикл. Использование viewWillDisappear будет работать отлично.   -  person lehn0058    schedule 16.09.2012
comment
Отлично, я добавил комментарий в качестве ответа для других.   -  person InsertWittyName    schedule 16.09.2012


Ответы (1)


Вы можете добавить класс в качестве наблюдателя в viewDidAppear и удалить его в viewWillDisappear.

person InsertWittyName    schedule 16.09.2012