2017-01-25 15 views
2

У меня есть приложение с двумя простыми экранами. На первом экране всегда открывается один и тот же экземпляр второго экрана. На втором экране есть text field и button, чтобы вручную скрыть keyboard.iOS UITextField resignFirstResponder on viewWillDisappear

resignFirstResponderviewWillDisappear не работает.

Случай 1:

  • Нажмите openSearchButton на главном экране.
  • Открыт SearchViewController.
  • Нажмите текстовое поле.
  • Клавиатура становится видимой.
  • Нажмите кнопку «Назад».
  • Приложение возвращается к первому экрану.
  • Нажмите на кнопку OpenSearchButton на главном экране.
  • (iOS 10.2) Экран полностью белый на короткое время.
  • Открыт SearchViewController.
  • Текстовое поле становится первым ответчиком, и клавиатура становится видимой.

Случай 2:

  • Нажмите openSearchButton на главном экране.
  • Открыт SearchViewController.
  • Нажмите текстовое поле.
  • Клавиатура становится видимой.
  • Щелкните hideKeyboardButton
  • Клавиатура скрывается.
  • Нажмите кнопку «Назад».
  • Приложение возвращается к первому экрану.
  • Нажмите на кнопку OpenSearchButton на главном экране.
  • Открыт SearchViewController.

Код:

  @implementation MainViewController 
     -(void) viewDidLoad { 
      [super viewDidLoad]; 
      UIStoryboard *sb = [UIStoryboardWithName:@"Main" bundle:nil]; 
      self.searchView = (SearchViewController*) [sb instantiateViewControllerWithIdentifier:@"searchView"]; 
     } 

     - (IBAction)openSearchButtonClicked:(id)sender{ 
      [self.navigationController pushViewController:self.searchView animated:YES]; 
     } 
     @end 

     @implementation SearchViewController 
     - (void)viewWillDisappear:(BOOL)animated{ 
      assert(self.searchTextField != nil);  
      [self.searchTextField resignFirstResponder]; 
      [super viewWillDisappear:animated]; 
     } 

     - (IBAction)hideKeyboardButtonClicked:(id)sender{ 
      [self.searchTextField resignFirstResponder]; 
     } 
     @end 
+0

Try [self.view endEditing: true]; – ChanWarde

+0

@ChanWarde Это тоже не работает. – fthdgn

+0

Является ли ваша (IBAction) hideKeyboardButtonClicked работоспособной? – ChanWarde

ответ

0
-(BOOL) textFieldShouldReturn: (UITextField *) textField 
{ 
    [textField resignFirstResponder]; 
    return YES; 
} 

Но вам нужно добавить UITextFieldDelegate к вашему SearchViewController сделать -(BOOL) textFieldShouldReturn: работу там.

1

Я решил проблему с обходным решением. Я проверил трассировку стека textFieldDidBeginEditing после повторного открытия searchView. Как-то UIKit решает называть beFirstResponder в текстовом поле.

Мое решение таково: не разрешать текстовое поле быть первым ответчиком до тех пор, пока не появится контроллер вида. Однако на iOS 10.2 все еще мигает белый экран.

- (void)viewDidAppear:(BOOL)animated{ 
    [super viewDidAppear:animated]; 
    self.allowToBecomeFirstResponser = YES; 
} 
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField{ 
    return self.allowToBecomeFirstResponser ; 
} 
- (void)viewWillDisappear:(BOOL)animated{ 
    self.allowToBecomeFirstResponser = NO; 
    [super viewWillDisappear:animated]; 
}  

0 ??? 0x000000011d54d91c 0x0 + 4787067164, 
1 DEMO 0x000000010c24d880 main + 0, 
2 UIKit 0x000000010d60a227 -[UITextField _becomeFirstResponder] + 481, 
3 UIKit 0x000000010d04d28d -[UIResponder becomeFirstResponder] + 324, 
4 UIKit 0x000000010cf42e03 -[UIView(Hierarchy) becomeFirstResponder] + 99, 
5 UIKit 0x000000010d609ad7 -[UITextField becomeFirstResponder] + 51, 
6 UIKit 0x000000010cf42e3b -[UIView(Hierarchy) deferredBecomeFirstResponder] + 49, 
7 UIKit 0x000000010cf43144 __45-[UIView(Hierarchy) _postMovedFromSuperview:]_block_invoke + 175, 
8 UIKit 0x000000010cf43086 -[UIView(Hierarchy) _postMovedFromSuperview:] + 437, 
9 UIKit 0x000000010cf4cf4b -[UIView(Internal) _addSubview:positioned:relativeTo:] + 1604, 
10 UIKit 0x000000010cecf392 -[_UIParallaxDimmingView didMoveToWindow] + 123, 
11 UIKit 0x000000010cf4a9a0 -[UIView(Internal) _didMoveFromWindow:toWindow:] + 1482, 
12 UIKit 0x000000010cf4a68e -[UIView(Internal) _didMoveFromWindow:toWindow:] + 696, 
13 UIKit 0x000000010cf43112 __45-[UIView(Hierarchy) _postMovedFromSuperview:]_block_invoke + 125, 
14 UIKit 0x000000010cf43086 -[UIView(Hierarchy) _postMovedFromSuperview:] + 437, 
15 UIKit 0x000000010cf4cf4b -[UIView(Internal) _addSubview:positioned:relativeTo:] + 1604, 
16 UIKit 0x000000010cecbc38 __53-[_UINavigationParallaxTransition animateTransition:]_block_invoke + 2101, 
17 UIKit 0x000000010cf475ce +[UIView(Animation) performWithoutAnimation:] + 65, 
18 UIKit 0x000000010cecb072 -[_UINavigationParallaxTransition animateTransition:] + 1225, 
19 UIKit 0x000000010d01fe6c -[UINavigationController _startCustomTransition:] + 3038, 
20 UIKit 0x000000010d02b3fe -[UINavigationController _startDeferredTransitionIfNeeded:] + 386, 
21 UIKit 0x000000010d02bf47 -[UINavigationController __viewWillLayoutSubviews] + 43, 
22 UIKit 0x000000010d171509 -[UILayoutContainerView layoutSubviews] + 202,