防止恢复第一响应者
Posted
技术标签:
【中文标题】防止恢复第一响应者【英文标题】:Preventing restoration of first responder 【发布时间】: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:
中设置滚动位置,从而导致在视图出现后发生滚动。
有没有更好的方法来防止这种情况发生?
【问题讨论】:
我已经解决了这个问题,每次我想显示它时都重新创建视图控制器,但这不是一个理想的解决方案。 【参考方案1】:我遇到了类似的问题,我发现如果您在呈现的视图控制器的演示开始后辞职第一响应者,您将恢复第一响应者。如果你在它不会恢复之前调用它。获取 viewWillAppear:
或任何其他调用的外观方法意味着演示(或转换)开始。
在调用presentViewController:animated:completion:
或任何其他演示/转换方法之前请先退出第一响应者。我没有为 segues 尝试过,但我猜你可以在 prepareForSegue:sender:
中辞职。
希望这会有所帮助。
【讨论】:
以上是关于防止恢复第一响应者的主要内容,如果未能解决你的问题,请参考以下文章