Toolbar with “Previous” and “Next” for Keyboard inputAccessoryView

后端 未结 7 1753
面向向阳花
面向向阳花 2020-12-02 20:53

I\'ve been trying to implement this toolbar, where only the \'Next\' button is enabled when the top textField is the firstResponder and only the \'Previous\' button is enabl

7条回答
  •  被撕碎了的回忆
    2020-12-02 21:28

    Here is a UIViewController extension that I use whenever I need a group of UITextFields to provide navigation via input accessory. No need to use UITextField delegation with this approach, and adding the behavior to multiple forms becomes a single-liner. Also supports the 'Done' button to dismiss.

    extension UIViewController {
      func addInputAccessoryForTextFields(textFields: [UITextField], dismissable: Bool = true, previousNextable: Bool = false) {
        for (index, textField) in textFields.enumerated() {
          let toolbar: UIToolbar = UIToolbar()
          toolbar.sizeToFit()
    
          var items = [UIBarButtonItem]()
          if previousNextable {
            let previousButton = UIBarButtonItem(image: UIImage(named: "Backward Arrow"), style: .plain, target: nil, action: nil)
            previousButton.width = 30
            if textField == textFields.first {
              previousButton.isEnabled = false
            } else {
              previousButton.target = textFields[index - 1]
              previousButton.action = #selector(UITextField.becomeFirstResponder)
            }
    
            let nextButton = UIBarButtonItem(image: UIImage(named: "Forward Arrow"), style: .plain, target: nil, action: nil)
            nextButton.width = 30
            if textField == textFields.last {
              nextButton.isEnabled = false
            } else {
              nextButton.target = textFields[index + 1]
              nextButton.action = #selector(UITextField.becomeFirstResponder)
            }
            items.append(contentsOf: [previousButton, nextButton])
          }
    
          let spacer = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
          let doneButton = UIBarButtonItem(barButtonSystemItem: .done, target: view, action: #selector(UIView.endEditing))
          items.append(contentsOf: [spacer, doneButton])
    
    
          toolbar.setItems(items, animated: false)
          textField.inputAccessoryView = toolbar
        }
      }
    }
    

    example:

    let field1 = UITextField()
    let field2 = UITextField()
    addInputAccessoryForTextFields([field1, field2], dismissable: true, previousNextable: true)
    

    Here's a reasonable arrow icon.

提交回复
热议问题