首页 > 解决方案 > 防止恢复第一响应者

问题描述

如果当视图控制器从UINavigationController堆栈中弹出时视图是第一响应者,即使第一响应者已辞职-viewWillDisappear:UINavigationControllerDelegate's -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:,从而导致在视图出现后发生滚动。

有没有更好的方法来防止这种情况?

标签: iosuinavigationcontrolleruitextfielduikit

解决方案


我遇到了类似的问题,我发现如果您在呈现的视图控制器开始呈现后辞职第一响应者,您将恢复第一响应者。如果你在它不会恢复之前调用它。获取viewWillAppear:或任何其他调用的外观方法意味着演示(或转换)开始。

在调用presentViewController:animated:completion:或任何其他演示/转换方法之前先让第一响应者辞职。我没有为 segues 尝试过,但我猜你可以辞职prepareForSegue:sender:

希望这可以帮助。


推荐阅读