ios - 防止恢复第一响应者
问题描述
如果当视图控制器从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:
,从而导致在视图出现后发生滚动。
有没有更好的方法来防止这种情况?
解决方案
我遇到了类似的问题,我发现如果您在呈现的视图控制器开始呈现后辞职第一响应者,您将恢复第一响应者。如果你在它不会恢复之前调用它。获取viewWillAppear:
或任何其他调用的外观方法意味着演示(或转换)开始。
在调用presentViewController:animated:completion:
或任何其他演示/转换方法之前先让第一响应者辞职。我没有为 segues 尝试过,但我猜你可以辞职prepareForSegue:sender:
。
希望这可以帮助。
推荐阅读
- google-cloud-dataflow - 在 Cloud Dataflow 中限制对第三方的并发调用
- python - 尝试将浮点操作数和度数符号组合到同一个变量中
- c++ - Why does my custom allocator preform proportional to malloc?
- ios - URLSession dataTask / uploadTask splitting large uploads into multiple requests
- python - 数据帧值预处理 - readexcel 在导入期间在值中删除撇号或在导入后将字符串转换为 int 值的其他方式
- clojure - Clojure 反向链接事实
- javascript - JavaScript 当前日期和特定日期之间的天数,Date() 奇怪的行为
- javascript - 正则表达式允许单词之间的标点符号和空格
- ios - 调用popToViewController后如何清除视图中的文本框
- javascript - 在反应中将道具从父组件传递给子组件