UIPageViewController如何在滚动时防止键盘隐藏?

5

我有一个包含多个UIViewControllerUIPageViewController,每个UIViewController都包含一个UITextField

每当我滑动UIPageViewController时,键盘会自动关闭。有没有办法防止这种行为发生?

在新的UITextfield上调用becomeFirstResponder,但是动画并不能解决问题。


当您按下回车键时,将调用textFieldShouldReturn:方法。滚动时不应该调用此方法。 - Stonz2
@Dima disablesAutomaticKeyboardDismissal ж— жі•и§ЈеҶій—®йўҳпјҒ - PGLongo
你能否将一个展示这个问题的样例项目上传到Github或其他地方吗?这样有助于我们查看代码。 - Dima
1
使用 UIPageViewControllerTransitionStylePageCurl 而不是 UIPageViewControllerTransitionStyleScroll 不会关闭键盘。也许问题与滚动动画有关。 - PGLongo
2
你有没有找到这个问题的答案? - YichenBman
显示剩余2条评论
3个回答

0

在使用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()
})

0

不幸的是,这似乎是由于转换动画显示为完成之前实际上并未完成, 我能想到的解决方法有: 1. 将动画设置为false 2. 在下一个VC中将textFieldShouldEndEditing设置为NO或使用bool处理它 3. 在动画中或下一个VC的viewWillAppear中添加延迟


0

您可以尝试将PageViewController作为其他视图控制器的ChildViewController嵌入其中。

我相信这样做,PageViewController中的导航不会影响键盘。 如果仍然无法正常工作,您可以在转换发生时将ParentViewController设置为第一个响应者。


@PGLongo 有解决办法吗? - Kunal Gupta
最后我使用了BWWalkthrough,并在walkthroughPageDidChange中更改了第一响应者。 - PGLongo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接