在呈现UIViewController

时间:2017-06-04 17:23:34

标签: ios uiviewcontroller swift3 xcode8 inputaccessoryview

我有一个带有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。我已经在我的代码中的许多不同的地方尝试了上述三行的几乎所有组合。我想我错过了一些简单的事情。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

几天后我终于想出了一些有用的东西......我想在将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仍然存在。