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
。当页面滚动到带有字段的视图时,我希望它成为第一响应者并打开键盘。下面是发生的情况:
- 我调用
ViewController的[self.locationQuery becomeFirstResponder]
方法。但它从未打开键盘viewdide
- 我在
,并且会短暂出现,但很快就会被忽略视图中也会这样做,它会出现
- 如果我在带有文本字段的页面上,将页面拉到一半并放开(不更改页面),
可以很好地接收焦点self.locationQuery
- 当我显式地给文本字段指定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()}