防止恢复第一响应者

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: 中辞职。

希望这会有所帮助。

【讨论】:

以上是关于防止恢复第一响应者的主要内容,如果未能解决你的问题,请参考以下文章

TableView viewForHeaderInSection 不会恢复第一响应者

在警报中选择选项时,如何防止我的文本字段成为第一响应者?

显示system进程无响应是怎么回事

iOS获取当前页面的第一响应者

IOS - 如何防止后台按钮被点击?

防止用户快速多次点击按钮,响应事件响应多次