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

+0

有意思。我认为只有textFields和textViews有一个inputAccessoryView ...无论如何:我认为对于inputAccessoryView在屏幕上它属于的视图必须是当前的响应者...但是因为你提交了一个viewControlle ...它已经现在你需要让它的视图再次成为firstResponder ...我猜快速解决方案是将'view.becomeFirstResponder()'放在你的'viewDidAppear'里面,以确保inputAccessoryView在你每次来到屏幕。 – Honey

+0

我在这里找到了,如果你真的有兴趣,可以跳到15:00:https://www.youtube.com/watch?v =ky7YRh01by8谢谢你的建议! –

+0

我的建议是否有效? – Honey

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

+0

谢谢你的回答!我投了票,但我不到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仍然存在。