我有UIPageViewController
个UIViewController
,每个UITextField
包含UIPageViewController
。
每当我滑动becomeFirstResponder
时,键盘都会自动解除。有没有办法防止这种行为?
在新UITextfield
上调用{{1}},但动画不会解决问题。
答案 0 :(得分:0)
您可以尝试将PageViewController嵌入为其他viewController的ChildViewController。
我相信这样,PageViewController中的导航不会影响键盘。 我不确定是否需要它,但是如果它仍然不起作用,你可以在转换发生时将ParentViewController设置为firstResponder。
答案 1 :(得分:0)
不幸的是,这似乎是由于过渡完成之前实际完成的动画所致, 我能想到的解决方法是 1.虚假 2.在下一个VC中将textFieldShouldEndEditing设置为返回NO或使用bool处理它 3.在动画或下一个VC viewWillAppear
中添加延迟答案 2 :(得分:0)
在setViewControllers
上使用UIPageViewController
(设置没有滚动的控制器)时,似乎在scrollView
到达其最终位置之前调用了完成块。如果这样做,它将解雇第一响应者。
我们找到的解决方案是首先获取滚动视图:
// In UIPageViewController subclass
for subview in self.view.subviews {
if let scrollV = subview as? UIScrollView {
scrollV.delegate = self
self.scrollView = scrollV // Optional, we don't really need it
}
}
滚动视图位置在其offset
是中间控制器的x
位置时完成。也就是说,offset
将等于视图的长度。
func scrollViewDidScroll(_ scrollView: UIScrollView) {
if scrollView.contentOffset.x == self.view.width {
// Transition is 'really' done.
}
}
此时,您可以发送过渡完成的通知。 我们所做的就是保留一个完成块,并在转换完成后调用它。
创建一个函数,以便控制器可以在其中传递一个块:
func transitionCompleted(completed:(()->())?) {
self.transitionCompletedBlock = completed
}
转换完成后:
self.transitionCompletedBlock?()
带有键盘的控制器如下所示:
pagerController.transitionCompleted(completed: {
self.textfield.becomeFirstResponder()
})