Какова причина, по которой однажды вызвала UIKeyBoardWIllShowNotification?
Я использую уведомления keyboardWasShown
и keyboardWillBeHidden
для сдвига представления, чтобы получить видимое текстовое представление.
У меня есть приложение 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;
}
Ответы
Ответ 1
вам нужно 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 контроллерах представления
Надеюсь, что это поможет.