我有一个包含多个UIViewController
的UIPageViewController
,每个UIViewController
都包含一个UITextField
。
每当我滑动UIPageViewController
时,键盘会自动关闭。有没有办法防止这种行为发生?
在新的UITextfield
上调用becomeFirstResponder
,但是动画并不能解决问题。
我有一个包含多个UIViewController
的UIPageViewController
,每个UIViewController
都包含一个UITextField
。
每当我滑动UIPageViewController
时,键盘会自动关闭。有没有办法防止这种行为发生?
在新的UITextfield
上调用becomeFirstResponder
,但是动画并不能解决问题。
在使用setViewControllers
设置没有滚动的控制器时,似乎完成块是在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()
})
不幸的是,这似乎是由于转换动画显示为完成之前实际上并未完成, 我能想到的解决方法有: 1. 将动画设置为false 2. 在下一个VC中将textFieldShouldEndEditing设置为NO或使用bool处理它 3. 在动画中或下一个VC的viewWillAppear中添加延迟
您可以尝试将PageViewController作为其他视图控制器的ChildViewController嵌入其中。
我相信这样做,PageViewController中的导航不会影响键盘。 如果仍然无法正常工作,您可以在转换发生时将ParentViewController设置为第一个响应者。
textFieldShouldReturn:
方法。滚动时不应该调用此方法。 - Stonz2disablesAutomaticKeyboardDismissal
ж— жі•и§ЈеҶій—®йўҳпјҒ - PGLongo