【发布时间】:2018-08-13 13:36:30
【问题描述】:
当视图控制器从UINavigationController 堆栈中弹出时,如果视图是第一响应者,即使第一响应者在-viewWillDisappear: 或UINavigationControllerDelegate 的-navigationController:willShowViewController:animated: 中辞职,当同一个视图控制器被推送时回到导航堆栈,第一响应者被恢复。我认为这可能是 iOS 11 中的新行为。
在我的情况下,我重新配置了视图控制器并且不希望恢复第一响应者,但似乎没有简单的方法可以防止这种情况。我可以通过在视图控制器(这是UITextField's 的代表)中执行以下操作来防止它:
- (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: 中设置滚动位置,从而导致在视图出现后发生滚动。
有没有更好的方法来防止这种情况发生?
【问题讨论】:
-
我已经解决了这个问题,每次我想显示它时都重新创建视图控制器,但这不是一个理想的解决方案。
标签: ios uinavigationcontroller uitextfield uikit