2015-06-15 2 views
2

У меня есть вид с UIScrollView и есть много UITextField Я закрываю клавиатуру, когда я касаюсь вида, и он отлично работает в то же время. Я хочу закрыть клавиатуру, когда я просматриваю Посмотреть. Моя проблема заключается в том, когда я просматриваю вид, который закрывает клавиатуру, но он вызывает метод (keyboardWillHide) два раза, из-за чего проблема связана с неправильным настройкой экрана. Как я могу предотвратить вызов метода два раза?uikeyboardwillhidenotification метод вызова дважды при прокрутке

Мой код:

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    UITapGestureRecognizer* tapGesture = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(closeTextInput)]; 
tapGesture.cancelsTouchesInView = NO; 
    [self.view addGestureRecognizer:tapGesture]; 

    _scrllView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag; 
} 

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

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

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

    [[NSNotificationCenter defaultCenter] removeObserver:self 
               name:UIKeyboardWillShowNotification 
               object:nil]; 

    [[NSNotificationCenter defaultCenter] removeObserver:self 
               name:UIKeyboardWillHideNotification 
               object:nil]; 
} 

-(void)keyboardWillHide { 

    if (self.view.frame.origin.y >= 0) 
    { 
     [self setViewMovedUp:YES]; 
    } 
    else if (self.view.frame.origin.y < 0) 
    { 
     [self setViewMovedUp:NO]; 
    } 
} 

-(void)setViewMovedUp:(BOOL)movedUp{ 

    [UIView beginAnimations:nil context:NULL]; 
    [UIView setAnimationDuration:0.3]; 

    CGRect rect = self.view.frame; 
    if (movedUp) 
    { 
     if (self.view.frame.origin.y != -kOFFSET_FOR_KEYBOARD){ 

     rect.origin.y -= kOFFSET_FOR_KEYBOARD; 
     rect.size.height += kOFFSET_FOR_KEYBOARD; 
     } 
    } 
    else 
    { 
     rect.origin.y += kOFFSET_FOR_KEYBOARD; 
     rect.size.height -= kOFFSET_FOR_KEYBOARD; 
    } 
     self.view.frame = rect; 
     [UIView commitAnimations]; 
} 

ответ

0

Попытайтесь держать BOOL keyboardIsUp, которое истинно, если клавиатура, а потом при входе в функцию keyboardWillHide, спросите, если keyboardIsUp верно. Если это правда, продолжайте. Если оно ложно, выход из функции:

-(void)keyboardWillHide 
{ 
    if (keyboardIsUp == NO) 
     return; 
    else 
     //your code 

Ваша функция будет по-прежнему будет называться дважды, или больше, но будет делать только его функциональность сразу. Просто не забудьте установить для клавиатурыIsUp значение YES и NO, если это необходимо.

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