iOS UITextField resignFirstResponder при просмотре исчезнет
У меня есть приложение с двумя простыми экранами. Первый экран всегда открывает один и тот же экземпляр второго экрана. Второй экран имеет text field
и button
скрыть вручную keyboard
,
resignFirstResponder
на viewWillDisappear
не работает.
Случай 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
2 ответа
Я решил проблему с обходным путем. Я проверил трассировку стека textFieldDidBeginEditing после повторного открытия searchView. Каким-то образом UIKit решает вызвать функцию стал FirstResponder для текстового поля.
Мое решение заключается в следующем: не разрешать текстовое поле быть первым респондентом, пока не появился контроллер представления. Однако мигающий белый экран все еще происходит на 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,
-(BOOL) textFieldShouldReturn: (UITextField *) textField
{
[textField resignFirstResponder];
return YES;
}
Но вам нужно добавить UITextFieldDelegate
в ваш SearchViewController, чтобы сделать -(BOOL) textFieldShouldReturn:
работать там.