2009-12-11 6 views
2

Я использую keyboardWasShown и keyboardWillBeHidden уведомление для скользящего просмотра, чтобы получить видимый текст.Какова причина, по которой однажды вызвала UIKeyBoardWIllShowNotification?

У меня есть приложение UITabBar с шестью вкладками.

В каждом представлении я использую UINavigationController.

В подробном представлении каждого UITableViewCell Я пользуюсь клавиатурными уведомлениями.

Так что проблема заключается в том, что уведомления о клавиатуре работают в первый раз, когда я буду использовать. на других вкладках это не сработает.

Код выглядит следующим образом:

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

и методы

- (void)keyboardWasShown:(NSNotification *)aNotification { 
    if (keyboardShown) 
     return; 


     NSDictionary *info = [aNotification userInfo]; 
     NSValue *aValue = [info objectForKey:UIKeyboardBoundsUserInfoKey]; 
     CGSize keyboardSize = [aValue CGRectValue].size; 

     NSTimeInterval animationDuration = 0.300000011920929; 
     CGRect frame = self.view.frame; 
     frame.origin.y -= keyboardSize.height-100; 
     frame.size.height += keyboardSize.height-100; 
     [UIView beginAnimations:@"ResizeForKeyboard" context:nil]; 
     [UIView setAnimationDuration:animationDuration]; 
     self.view.frame = frame; 
     [UIView commitAnimations]; 

    viewMoved = YES; 

    keyboardShown = YES; 
} 
- (void)keyboardWasHidden:(NSNotification *)aNotification { 
    if (viewMoved && tvAddreview) { 
     NSDictionary *info = [aNotification userInfo]; 
     NSValue *aValue = [info objectForKey:UIKeyboardBoundsUserInfoKey]; 
     CGSize keyboardSize = [aValue CGRectValue].size; 

     NSTimeInterval animationDuration = 0.300000011920929; 
     CGRect frame = self.view.frame; 
     frame.origin.y += keyboardSize.height-100; 
     frame.size.height -= keyboardSize.height-100; 
     [UIView beginAnimations:@"ResizeForKeyboard" context:nil]; 
     [UIView setAnimationDuration:animationDuration]; 
     self.view.frame = frame; 
     [UIView commitAnimations]; 

     viewMoved = NO; 
    } 

    keyboardShown = NO; 
} 
+0

Вы также можете получить значение анимацииДобавление из userInfo уведомления. – Morion

+0

где находятся эти методы и добавление наблюдателя? – Morion

+0

Я добавляю наблюдателей в viewDidLoad – harshalb

ответ

9

вы должны dothis в eachClass так:

-(void) viewWillAppear: (BOOL)animated 
{ 
    [super viewWillAppear:animated]; 

    NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; 
    [nc addObserver:self 
      selector:@selector(keyboardWasShown:) 
       name:UIKeyboardWillShowNotification 
      object:nil]; 
    [nc addObserver:self 
      selector:@selector(keyboardWasHidden:) 
       name:UIKeyboardWillHideNotification 
      object:nil]; 

} 

- (void) viewWillDisappear: (BOOL)animated{ 

    [super viewWillDisappear:animated]; 

    NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; 
    [nc removeObserver:self 
        name:UIKeyboardWillShowNotification 
       object:nil]; 
    [nc removeObserver:self 
        name:UIKeyboardWillHideNotification 
       object:nil]; 
} 

потому уведомления находятся на уровень приложения не соответствует уровню вашего класса. Поэтому, если вы добавили их в один класс, а не во всех классах, переходите к следующему классу. уведомление все равно вызовет ключ keyboardWasShown:, а другой из класса, в котором вы добавили уведомления, поэтому ваши локальные переменные, такие как ... viewMoved = YES;

keyboardShown = YES; 

выбросит плохие избыточные исключения

В вашем случае также необходимо сделать во всех 6 контроллеров зрения

Надеется, что это помогает.

Смежные вопросы