ios swift accessoryview

ios - agrega una vista en la parte superior del teclado usando InputAccessoryView swift



(4)

Estoy tratando de agregar una vista para estar siempre encima del teclado. Lo hice primero con KeyboardWillShow / Hide, pero no cubre todos los casos y estoy tratando de usar inputAccesoryView. esto es lo que intenté

private var accessoryView = UIView(frame: CGRectZero) class ViewController : UIViewController { var myView: customUIView override var inputAccessoryView: UIView { return accessoryView } override func canBecomeFirstResponder() -> Bool { return true } override func viewDidLoad() { super.viewDidLoad() accessoryView = myView } }

Recibo el siguiente error: la aplicación finalizó debido a la excepción no detectada ''UIViewControllerHierarchyInconsistency'', razón: ''controlador de vista hijo: UICompatibilityInputViewController debe tener controlador de vista padre: MyViewController pero el padre solicitado es: UIInputWindowController:''

Cualquier ayuda será apreciada!


Detalles

xcode 9.2, swift 4

Solución

TecladoToolbarButton

import UIKit enum KeyboardToolbarButton: Int { case done = 0 case cancel case back, backDisabled case forward, forwardDisabled func createButton(target: Any?, action: Selector?) -> UIBarButtonItem { var button: UIBarButtonItem! switch self { case .back: button = UIBarButtonItem(title: "back", style: .plain, target: target, action: action) case .backDisabled: button = UIBarButtonItem(title: "back", style: .plain, target: target, action: action) button.isEnabled = false case .forward: button = UIBarButtonItem(title: "forward", style: .plain, target: target, action: action) case .forwardDisabled: button = UIBarButtonItem(title: "forward", style: .plain, target: target, action: action) button.isEnabled = false case .done: button = UIBarButtonItem(title: "done", style: .plain, target: target, action: action) case .cancel: button = UIBarButtonItem(title: "cancel", style: .plain, target: target, action: action) } button.tag = rawValue return button } static func detectType(barButton: UIBarButtonItem) -> KeyboardToolbarButton? { return KeyboardToolbarButton(rawValue: barButton.tag) } }

KeyboardToolbar

import UIKit protocol KeyboardToolbarDelegate: class { func keyboardToolbar(button: UIBarButtonItem, type: KeyboardToolbarButton, tappedIn toolbar: KeyboardToolbar) } class KeyboardToolbar: UIToolbar { weak var toolBarDelegate: KeyboardToolbarDelegate? init() { super.init(frame: .zero) barStyle = UIBarStyle.default isTranslucent = true sizeToFit() isUserInteractionEnabled = true } func setup(leftButtons: [KeyboardToolbarButton], rightButtons: [KeyboardToolbarButton]) { let leftBarButtons = leftButtons.map { (item) -> UIBarButtonItem in return item.createButton(target: self, action: #selector(buttonTapped)) } let rightBarButtons = rightButtons.map { (item) -> UIBarButtonItem in return item.createButton(target: self, action: #selector(buttonTapped(sender:))) } let spaceButton = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil) setItems(leftBarButtons + [spaceButton] + rightBarButtons, animated: false) } required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) } @objc func buttonTapped(sender: UIBarButtonItem) { if let type = KeyboardToolbarButton.detectType(barButton: sender) { toolBarDelegate?.keyboardToolbar(button: sender, type: type, tappedIn: self) } } }

Ejemplo completo de uso

import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. createTextField(frame: CGRect(x: 50, y: 50, width: 200, height: 40), leftButtons: [.backDisabled, .forward], rightButtons: [.cancel]) createTextField(frame: CGRect(x: 50, y: 120, width: 200, height: 40), leftButtons: [.back, .forwardDisabled], rightButtons: [.done]) } private func createTextField(frame: CGRect, leftButtons: [KeyboardToolbarButton] = [], rightButtons: [KeyboardToolbarButton] = []) { let textField = UITextField(frame: frame) textField.borderStyle = .roundedRect let toolbar = KeyboardToolbar() toolbar.toolBarDelegate = self toolbar.setup(leftButtons: leftButtons, rightButtons: rightButtons) textField.inputAccessoryView = toolbar view.addSubview(textField) } } extension ViewController: KeyboardToolbarDelegate { func keyboardToolbar(button: UIBarButtonItem, type: KeyboardToolbarButton, tappedIn toolbar: KeyboardToolbar) { print("Tapped button type: /(type)") } }

Resultados


Cambios para hacer a su código:

  • Regala un accessoryView altura
  • Eliminar var myView: customUIView y la viewDidLoad() completa de viewDidLoad()

Para obtener una vista que sobresalga del teclado, el código en sí es bastante simple. El código que publicó no es correcto, intente esto (tenga en cuenta que debe conectar textField al UITextField en su guión gráfico):

@IBOutlet weak var textField: UITextField! override func viewDidLoad() { super.viewDidLoad() let customView = UIView(frame: CGRect(x: 0, y: 0, width: 10, height: 44)) customView.backgroundColor = UIColor.red textField.inputAccessoryView = customView }


Prueba esto.

override var inputAccessoryView: UIView? { get { return containerView } } override var canBecomeFirstResponder: Bool { return true }