在嵌套在 PageViewController 中的 viewController 上设置 becomeFirstResponder

Setting becomeFirstResponder on viewController nested in PageViewController

我有一个 pageViewController,它有两个子视图控制器,您可以在它们之间滑动。其中一个有一个 textView,当你滚动到该页面时我想成为第一响应者,然后当你滚动离开时失去焦点。现在我有这个:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    composeTextView.delegate = self
    composeTextView.becomeFirstResponder()
}

当您开始滚动到视图上时,键盘就会出现。但是一旦滚动完成,键盘就会消失。

知道为什么会这样吗?

我最终找到了这个问题的答案。所以,在 viewDidAppear 中我添加了这个:

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

我很乐意为任何能够解释其工作原理的人打勾。

过渡风格的 Page Curl 可以正常工作,但不能用于 Scroll。

我认为问题是在 viewDidAppear 旧页面辞去第一响应者并选择新的响应者之后立即出现的,因此您设置为 firstResponder 的任何内容都将丢失。这是由于新旧视图在 window 中重复添加和删除而影响响应链。我认为在旧视图滚出屏幕后,出于某种原因它会被添加回 window,因为当你滚动回到它时,它已经准备好了。

如您在此日志中所见,在 viewDidAppear 之后,两个视图 window 都有许多奇怪的变化。新视图是 0x7fd87fa24160 那么为什么旧视图 0x7fd87fa059a0 被删除并多次添加到 window?

2020-06-01 10:22:14.093911+0100 Paging2[45575:3540067] DetailViewController 0x7fd87fa15850 viewDidAppear: 0x7fd87fa24160
2020-06-01 10:22:14.094973+0100 Paging2[45575:3540067] MyView 0x7fd87fa059a0 didMoveToWindow 0x0
2020-06-01 10:22:14.095358+0100 Paging2[45575:3540067] MyView 0x7fd87fa24160 didMoveToWindow 0x0
2020-06-01 10:22:14.096090+0100 Paging2[45575:3540067] MyView 0x7fd87fa059a0 didMoveToWindow 0x7fd87f80f3d0
2020-06-01 10:22:14.096511+0100 Paging2[45575:3540067] MyView 0x7fd87fa24160 didMoveToWindow 0x7fd87f80f3d0
2020-06-01 10:22:14.099019+0100 Paging2[45575:3540067] MyView 0x7fd87fa059a0 didMoveToWindow 0x0
2020-06-01 10:22:14.099318+0100 Paging2[45575:3540067] MyView 0x7fd87fa24160 didMoveToWindow 0x0
2020-06-01 10:22:14.099812+0100 Paging2[45575:3540067] MyView 0x7fd87fa059a0 didMoveToWindow 0x7fd87f80f3d0
2020-06-01 10:22:14.100306+0100 Paging2[45575:3540067] MyView 0x7fd87fa24160 didMoveToWindow 0x7fd87f80f3d0

为了比较这里是推送时的UINavigationController。我在这个 中了解到 window 的额外移动是为了过渡,打开慢速动画有帮助:

2020-06-01 10:49:16.786872+0100 NavWindowTest[45792:3560379] View 0x7fbfba608090 didMoveToWindow 0x0 (current view removed from window)
2020-06-01 10:49:16.787170+0100 NavWindowTest[45792:3560379] View 0x7fbfba608090 didMoveToWindow 0x7fbfba50c150 (current view added to window for transition)
2020-06-01 10:49:16.787577+0100 NavWindowTest[45792:3560379] View 0x7fbfba5124d0 didMoveToWindow 0x7fbfba50c150 (new view added)
2020-06-01 10:49:21.801791+0100 NavWindowTest[45792:3560379] View 0x7fbfba608090 didMoveToWindow 0x0 (old view removed from transition)
2020-06-01 10:49:21.803690+0100 NavWindowTest[45792:3560379] ViewController 0x7fbfbd005dd0 viewDidAppear: 0x7fbfba5124d0

viewDidAppear 在导航时最后调用但在分页时首先调用这一事实让我认为存在问题。