使用InputAccessoryView swift在键盘顶部添加视图

我正在尝试将uiview添加到键盘顶部。 我首先使用KeyboardWillShow / Hide完成了它,但它没有涵盖所有情况,我正在尝试使用inputAccesoryView。 这是我试过的:

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 } } 

我收到以下错误:由于未捕获的exception’UIViewControllerHierarchyInconsistency’终止应用程序,原因:’子视图控制器:UICompatibilityInputViewController应该有父视图控制器:MyViewController但请求父级是:UIInputWindowController:’

任何帮助将不胜感激!

为了让视图坚持键盘,代码本身非常简单。 您发布的代码不正确,请尝试此操作(请注意,您必须将textField连接到故事板中的UITextField ):

 @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 } 

对代码进行的更改:

  • accessoryView一个高度
  • 删除var myView: customUIView和整个viewDidLoad()覆盖

细节

xcode 9.2,swift 4

KeyboardToolbarButton

 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) } } } 

完整的使用示例

 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)") } } 

结果

在此处输入图像描述


在此处输入图像描述


在此处输入图像描述

Interesting Posts