UITextField在视图出现后丢失firstResponder

dcl*_*901 9 objective-c first-responder uipageviewcontroller

我有一个UIPageViewController.一个页面只有一个按钮,另一个页面有UITextField一个按钮.当页面滚动到带有字段的视图时,我想要它becomeFirstResponder并打开键盘.这是发生的事情:

  • 我调用了[self.locationQuery becomeFirstResponder]ViewController的viewDidAppear方法.但它永远不会打开键盘.

  • 我做同样的事情viewWillAppear,它看似简短,但后来很快就被解雇了.

  • 如果我在带有文本字段的页面上,并将页面拉到中途并放开(不更改页面),则self.locationQuery获得焦点就好了.

似乎其他东西正在从字段中获取firstResponder状态,但我不知道什么是什么,以及为什么它只会在页面发生变化时发生(而不是在页面转向失败后显示).有任何想法吗?

更新

我创建了一种方法来抓取视图以查看是否有任何其他视图确实采用firstResponder(来自此问题的答案:在不使用私有API的情况下获取当前的第一响应者).结果:

  • 当我明确地将第一响应者提供给文本字段时,该方法报告它具有第一响应者状态.

  • 当我不这样做时,它会返回null.

现在我更加困惑.

dcl*_*901 5

我真的不明白导致我的问题的本质,但我能够通过将调用包装在异步调度中来修复它viewDidAppear:

dispatch_async(dispatch_get_main_queue(), ^{
    MapManualViewController *strongSelf = weakSelf;
    [strongSelf.locationQuery becomeFirstResponder];
});
Run Code Online (Sandbox Code Playgroud)

  • 我尝试在 UIKeyboardWillHideNotification 触发的方法上设置断点并查看堆栈跟踪。看起来这是由 UIPageViewController 的实现细节引起的,它在动画结束时在两个内部滚动视图之间交换视图控制器的视图。然后 UITextView 将退出第一响应者,因为它从视图层次结构中被短暂删除。看起来您的解决方案只是将成为第一响应者的时间推迟到下一个运行循环。 (2认同)