Hacer que UIToolbar con TextField se mueva con el keyboard

Tengo una UIToolbar con TextField y un button como UIBarButtonItem. Estoy intentando usar esta barra de herramientas como un inputAccessory para el keyboard cuando el usuario toca TextField dentro de la barra de herramientas.

introduzca la descripción de la imagen aquí

Encontré esta pregunta que trata de resolver el mismo problema. Desafortunadamente, la solución no fue efectiva.

Lo que estoy intentando es:

class ChatViewController: UIViewController, CLLocationManagerDelegate, UITableViewDelegate, UITableViewDataSource { @IBOutlet weak var chatTableView: UITableView! @IBOutlet weak var chatToolbar: UIToolbar! @IBOutlet weak var textFieldBarButtonItem: UIBarButtonItem! override func viewDidAppear(animated: Bool) { super.viewDidLoad() self.chatTableView.delegate = self self.chatTableView.dataSource = self self.chatToolbar.removeFromSuperview() } override var inputAccessoryView: UIView{ get{ return self.chatToolbar } } override func canBecomeFirstResponder() -> Bool { return true } func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell{ let cell = UITableViewCell() return cell } func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return 0 } } 

Y lo que estoy recibiendo es:

 *** Terminating app due to uncaught exception 'UIViewControllerHierarchyInconsistency', reason: 'child view controller:<UICompatibilityInputViewController: 0x13ff34e00> should have parent view controller: <App.ChatViewController: 0x13ff21cc0> but requested parent is:<UIInputWindowController: 0x1400b4600>' 

¿Algunas ideas?

Lo primero es lo primero:

  1. Debería crear restricciones a su barra de herramientas en Storyboard (izquierda, abajo, derecha).
  2. Cree una salida a su restricción inferior en su controller de vista (arrastre desde el guión gráfico). Guardar el valor de restricción inicial (para recuperar cuando el keyboard desaparece)
  3. Cree un observador para saber cuándo aparece y desaparece su keyboard (3.1 y cree un gesto de toque para ocultar su keyboard)
  4. Cuando aparece el keyboard 4.1 y desaparece 4.2, solo cambiará el valor de restricción inferior (tamaño del keyboard). También puedes animar la barra de herramientas.

Algo como:

 class ChatViewController: UIViewController, CLLocationManagerDelegate, UITableViewDelegate, UITableViewDataSource { @IBOutlet weak var chatTableView: UITableView! @IBOutlet weak var chatToolbar: UIToolbar! @IBOutlet weak var textFieldBarButtonItem: UIBarButtonItem! //2 @IBOutlet weak var toolbarBottomConstraint: NSLayoutConstraint! var toolbarBottomConstraintInitialValue: CGFloat? override func viewDidAppear(animated: Bool) { super.viewDidAppear(animated) self.chatTableView.delegate = self self.chatTableView.dataSource = self self.chatToolbar.removeFromSuperview() //2 self.toolbarBottomConstraintInitialValue = toolbarBottomConstraint.constant //3 enableKeyboardHideOnTap() } // 3 // Add a gesture on the view controller to close keyboard when tapped private func enableKeyboardHideOnTap(){ NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillShow:"), name: UIKeyboardWillShowNotification, object: nil) // See 4.1 NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillHide:"), name: UIKeyboardWillHideNotification, object: nil) //See 4.2 // 3.1 let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "hideKeyboard") self.view.addGestureRecognizer(tap) } //3.1 func hideKeyboard() { self.view.endEditing(true) } //4.1 func keyboardWillShow(notification: NSNotification) { let info = notification.userInfo! let keyboardFrame: CGRect = (info[UIKeyboardFrameEndUserInfoKey] as! NSValue).CGRectValue() let duration = notification.userInfo![UIKeyboardAnimationDurationUserInfoKey] as! Double UIView.animateWithDuration(duration) { () -> Void in self.toolbarBottomConstraint.constant = keyboardFrame.size.height + 5 self.view.layoutIfNeeded() } } //4.2 func keyboardWillHide(notification: NSNotification) { let duration = notification.userInfo![UIKeyboardAnimationDurationUserInfoKey] as! Double UIView.animateWithDuration(duration) { () -> Void in self.toolbarBottomConstraint.constant = self.toolbarBottomConstraintInitialValue! self.view.layoutIfNeeded() } } override var inputAccessoryView: UIView{ get{ return self.chatToolbar } } override func canBecomeFirstResponder() -> Bool { return true } func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell{ let cell = UITableViewCell() return cell } func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return 0 } } 

¡Espero eso ayude!