Objective c UITextField在视图出现后丢失第一响应程序

Objective c UITextField在视图出现后丢失第一响应程序,objective-c,uipageviewcontroller,first-responder,Objective C,Uipageviewcontroller,First Responder,我有一个UIPageViewController。一个页面有一个按钮,另一个页面有一个带按钮的UITextField。当页面滚动到带有字段的视图时,我希望它成为第一响应者并打开键盘。下面是发生的情况: 我调用[self.locationQuery becomeFirstResponder]ViewController的viewdide方法。但它从未打开键盘 我在视图中也会这样做,它会出现,并且会短暂出现,但很快就会被忽略 如果我在带有文本字段的页面上,将页面拉到一半并放开(不更改页面),sel

我有一个
UIPageViewController
。一个页面有一个按钮,另一个页面有一个带按钮的
UITextField
。当页面滚动到带有字段的视图时,我希望它成为第一响应者并打开键盘。下面是发生的情况:

  • 我调用
    [self.locationQuery becomeFirstResponder]
    ViewController的
    viewdide
    方法。但它从未打开键盘

  • 我在
    视图中也会这样做,它会出现
    ,并且会短暂出现,但很快就会被忽略

  • 如果我在带有文本字段的页面上,将页面拉到一半并放开(不更改页面),
    self.locationQuery
    可以很好地接收焦点

看起来好像有什么东西在现场抢夺第一响应者的身份,但我一点也不知道是什么,也不知道为什么只有当页面发生变化时才会发生这种情况(而不是在翻页失败后才显示出来)。有什么想法吗

更新

我创建了一种对视图进行爬网的方法,以查看是否有任何其他视图确实使用了firstResponder(根据对这个问题的回答:)。结果:

  • 当我显式地给文本字段指定FirstResponder时,该方法报告它具有FirstResponder状态

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


现在我更困惑了。

我真的不知道是什么原因导致了我的问题,但我能够通过在
viewdide中以异步调度方式包装调用来修复它。

dispatch_async(dispatch_get_main_queue(), ^{
    MapManualViewController *strongSelf = weakSelf;
    [strongSelf.locationQuery becomeFirstResponder];
});

这件事夺走了我生命中的几个小时。下面是Swift 3.x的实现

DispatchQueue.main.async(execute: {() -> Void in
    let strongSelf: MapManualViewController = self
    strongSelf. textField.becomeFirstResponder()
})

我也把它放在了
视图中出现了

同样的问题,这解决了它,谢谢。我也不完全理解它,但我想既然我们是通过让键盘出现来触摸UI,那么获取主队列是有意义的。我已经尝试在UIKeyboardWillHideNotification触发的方法上粘贴一个断点,并查看堆栈跟踪。看起来这是由UIPageViewController的一个实现细节造成的,它在动画结束时在两个内部滚动视图之间交换视图控制器的视图。UITextView随后将辞去first responder的职务,因为它已从视图层次结构中短暂删除。看起来您的解决方案只是将成为第一响应者的时间推迟到下一个运行循环。此处不需要strongSelf,这可以缩短为
DispatchQueue.main.async(){self.textField.becomeFirstResponder()}