inputAccessoryView消失后呈现UIViewController
我有一个UICollectionViewController与inputAccessoryView。一切都很好,直到我呈现一个UIViewController,然后附件视图消失。试图获得基本的聊天应用程序功能。inputAccessoryView消失后呈现UIViewController
我在集合视图实现:
override var inputAccessoryView: UIView? {
get {
return inputContainerView
}
}
override var canBecomeFirstResponder: Bool {
return true
}
override func becomeFirstResponder() -> Bool {
return true
}
正如在其他多个线程的建议,我也呼吁(以集合视图),
view.resignFirstResponder()
view.inputAccessoryView?.reloadInputViews()
view.becomeFirstResponder()
驳回的UIViewController但没有后无济于事。打印(view.isFirstResponder)仍然打印false
。我在代码中的许多不同的地方尝试了几乎所有上述三行的组合。我想我错过了一些简单的东西。
显示和解除视图控制器的动画可能会导致问题,或者您没有为您设置为输入附件视图的视图维护全局ivar。尝试为附件视图创建只读ivar,以便在VC生命周期中只分配和维护一个实例。然后确保在调用reloadInputViews之前将其设置回文本字段。
谢谢你的回答!我投了票,但我不到15个代表 –
几天后,我终于想出了一些有效的工作......我想我是在collectionView被设置为第一响应者之前尝试呈现loginController。我不打电话present
我称这个功能为:
func presentLoginControllerAfterImFirstResponder(fromUser: Bool) {
// Starts a timer
Timer.scheduledTimer(withTimeInterval: 0.01, repeats: true) { (timer) in
// Is this view the first responder?
if self.isFirstResponder {
// Creates the loginController
let loginController = LoginController()
// Presents it
self.present(loginController, animated: fromUser, completion: {
// Once presented, sets rootViewController = self
loginController.rootViewController = self
})
// Stop the timer
timer.invalidate()
}
}
}
现在可以使用了。我想collectionView需要一些时间来将自己设置为第一响应者?我可以提出并解雇loginController没有问题,inputAccessoryView仍然存在。
有意思。我认为只有textFields和textViews有一个inputAccessoryView ...无论如何:我认为对于inputAccessoryView在屏幕上它属于的视图必须是当前的响应者...但是因为你提交了一个viewControlle ...它已经现在你需要让它的视图再次成为firstResponder ...我猜快速解决方案是将'view.becomeFirstResponder()'放在你的'viewDidAppear'里面,以确保inputAccessoryView在你每次来到屏幕。 – Honey
我在这里找到了,如果你真的有兴趣,可以跳到15:00:https://www.youtube.com/watch?v =ky7YRh01by8谢谢你的建议! –
我的建议是否有效? – Honey