2

我有一个带有 inputAccessoryView 的 UICollectionViewController。在我呈现 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 但无济于事后。print(view.isFirstResponder) 仍然打印false. 我已经在代码中的许多不同位置尝试了上述三行的几乎所有组合。我想我错过了一些简单的东西。

4

2 回答 2

0

呈现和关闭视图控制器的动画可能会导致问题,或者您尚未为已设置为输入附件视图的视图维护全局 ivar。尝试为附件视图创建一个只读 ivar,以便在整个 VC 生命周期中只分配和维护一个实例。然后确保在调用 reloadInputViews 之前将其设置回文本字段。

于 2017-06-04T19:38:29.753 回答
-1

几天后,我终于找到了可行的方法……我想我是在将 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 仍然存在。

于 2017-06-04T21:16:07.680 回答