[英]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
任何firstResponder
都会丢失。 这是由于旧视图和新视图在窗口中重复添加和删除而导致的,这会影响响应者链。 我认为在旧视图滚出屏幕后,由于某种原因,它会被添加回窗口,因为当您滚回它时,它已准备就绪。
正如您在此日志中看到的,在 viewDidAppear 之后,两个视图的窗口都有许多奇怪的变化。 新视图是 0x7fd87fa24160 那么为什么旧视图 0x7fd87fa059a0 被删除并多次添加到窗口中?
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 。 我在这个问题中了解到,额外移动到窗口是为了过渡,打开慢速动画有帮助:
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
在导航时最后调用但在分页中首先调用的事实让我认为存在问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.