如果在将视图控制器从UINavigationController
堆栈中弹出时视图是第一响应者,即使第一响应者在-viewWillDisappear:
或UINavigationControllerDelegate
的{{1}}中辞职了,当将同一视图控制器推回导航堆栈时,将还原第一响应者。我认为这可能是iOS 11中的新行为。
在我的情况下,我重新配置了视图控制器,并且不希望还原第一个响应者,但是似乎没有简单的方法可以防止这种情况的发生。我可以通过在视图控制器(-navigationController:willShowViewController:animated:
的委托)中执行以下操作来防止这种情况:
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:
中设置滚动位置,从而导致在视图显示之后发生滚动。
有更好的方法来防止这种情况吗?
答案 0 :(得分:0)
我有一个类似的问题,我发现如果在演示的视图控制器开始演示后辞职第一响应者,则将恢复第一响应者。如果您在无法恢复之前调用它。获得viewWillAppear:
或任何其他出现方法都意味着演示(或转换)开始了。
在调用presentViewController:animated:completion:
或任何其他表示/转换方法之前,请先辞职第一响应者。我没有尝试过进行隔离,但是我想您可以退出prepareForSegue:sender:
。
希望这会有所帮助。