2017-06-04 100 views
0

我有一個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

回答

0

顯示和解除視圖控制器的動畫可能會導致問題,或者您沒有爲您設置爲輸入附件視圖的視圖維護全局ivar。嘗試爲附件視圖創建只讀ivar,以便在VC生命週期中只分配和維護一個實例。然後確保在調用reloadInputViews之前將其設置迴文本字段。

+0

謝謝你的回答!我投了票,但我不到15個代表 –

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仍然存在。

相關問題