如果视图控制器从
UINavigationController
堆栈,即使第一个响应者在
-viewWillDisappear:
或
UINavigationControllerDelegate
的
-navigationController:willShowViewController:animated:
,当同一个视图控制器被推回到导航堆栈时,第一个响应程序将被还原。我认为这可能是iOS 11中的新行为。
在我的例子中,我重新配置了视图控制器,不希望第一个响应程序被恢复,但是似乎没有简单的方法来防止这种情况。我可以通过在视图控制器(它是
UITextField
的):
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
// do not begin editing when transitioning from/to this view controller.
// UINavigationController restores the previous input view first responder, we don't want that, this stops it
return self.transitionCoordinator == nil;
}
但是,这会导致一个小动画,其中视图会稍微滚动以适应之前出现的键盘
-textFieldShouldBeginEditing:
被调用,之后它将动画化。此外,包含文本字段的表视图不能滚动到顶部,因为滚动位置在文本字段处恢复。唯一的选择似乎是在
-viewDidAppear:
,导致在视图出现后出现滚动。
有没有更好的方法来防止这种情况?