Как се справяте с 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