2017-06-04 3 views
0

私はinputAccessoryViewを持つUICollectionViewControllerを持っています。 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しかし、誰に退去した後利用可能。 print(view.isFirstResponder)はまだfalseを出力します。私は上記の3つの行のほとんどすべての組み合わせを自分のコードのさまざまな場所で試しました。私は単純なものが欠けていると思う。

+0

興味深い。私はtextFieldsとtextViewsだけがinputAccessoryViewを持っていたと思っていました。なぜなら、私はinputAccessoryViewがスクリーン上にあると思っています。それは、現在のレスポンダでなければなりません...しかし、viewControlleを提示したので...私はすぐにあなたの 'viewDidAppear'の中に' view.becomeFirstResponder() 'を置くことになるだろうと思っています。これはinputAccessoryViewがあなたに来るたびにそこにいることを保証しています。画面。 – Honey

+0

私がここで見つけたのは、本当に興味がある場合は15:00にスキップします:https://www.youtube.com/watch?v=ky7YRh01by8提案していただきありがとうございます! –

+0

私の提案はうまくいきましたか? – Honey

答えて

0

ビューコントローラを表示および非表示するアニメーションが問題の原因となっている可能性があります。入力アクセサリビューとして設定したビューのグローバルivarが維持されていません。 accessoryview用の読み取り専用のivarを作成して、1つのインスタンスだけが割り当てられ、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は残っています。

関連する問題