如何使用Swift在IOS 8中为Numpad添加"完成"按钮?

Dej*_*dar 61 ios swift numpad

它使用默认键盘工作正常,但我不能使用numpad.

有任何想法吗?

Mar*_*ski 78

据我所知,你不能在键盘部分添加完成按钮; 你已经添加inputAccessoryViewUITextField或者UITextView(如果这是你使用的是什么).

查看文档以获取更多信息.

编辑:检查此问题以获取有关如何执行此操作的示例.

编辑2:Swift中的类似示例.

编辑3:编辑2中的代码,因为链接可能会过期.

override func viewDidLoad()
{
    super.viewDidLoad()

    //--- add UIToolBar on keyboard and Done button on UIToolBar ---//
    self.addDoneButtonOnKeyboard()
}

//--- *** ---//

func addDoneButtonOnKeyboard()
{
    var doneToolbar: UIToolbar = UIToolbar(frame: CGRectMake(0, 0, 320, 50))
    doneToolbar.barStyle = UIBarStyle.BlackTranslucent

    var flexSpace = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FlexibleSpace, target: nil, action: nil)
    var done: UIBarButtonItem = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.Done, target: self, action: Selector("doneButtonAction"))

    var items = NSMutableArray()
    items.addObject(flexSpace)
    items.addObject(done)

    doneToolbar.items = items
    doneToolbar.sizeToFit()

    self.textView.inputAccessoryView = doneToolbar
    self.textField.inputAccessoryView = doneToolbar

}

func doneButtonAction()
{
    self.textViewDescription.resignFirstResponder()
}
Run Code Online (Sandbox Code Playgroud)

  • 您可以更改此设置,而不必本地化按钮: let done: UIBarButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.done, target: self, action: #selector(self.doneButtonAction)) (4认同)

Ada*_*ler 56

一个Swift-3版本(Marko的解决方案 - 对我有用)

(就我而言,我有一个UITextField标识为textfield)

func addDoneButtonOnKeyboard() {
    let doneToolbar: UIToolbar = UIToolbar(frame: CGRect(x: 0, y: 0, width: 320, height: 50))
    doneToolbar.barStyle       = UIBarStyle.default        
    let flexSpace              = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.flexibleSpace, target: nil, action: nil)
    let done: UIBarButtonItem  = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.done, target: self, action: #selector(ViewController.doneButtonAction))

    var items = [UIBarButtonItem]()
    items.append(flexSpace)
    items.append(done)

    doneToolbar.items = items
    doneToolbar.sizeToFit()

    self.textfield.inputAccessoryView = doneToolbar
}

func doneButtonAction() {
    self.textfield.resignFirstResponder()
}
Run Code Online (Sandbox Code Playgroud)


Dej*_*sov 19

Swift 3解决方案使用@IBInpectable和扩展.对于项目中的每个UITextField,下拉列表将显示在Interface Builder的Attribute Inspector下.

extension UITextField{    
    @IBInspectable var doneAccessory: Bool{
        get{
            return self.doneAccessory
        }
        set (hasDone) {
            if hasDone{
                addDoneButtonOnKeyboard()
            }
        }
    }

    func addDoneButtonOnKeyboard()
    {
        let doneToolbar: UIToolbar = UIToolbar(frame: CGRect.init(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 50))
        doneToolbar.barStyle = .default

        let flexSpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
        let done: UIBarButtonItem = UIBarButtonItem(title: "Done", style: .done, target: self, action: #selector(self.doneButtonAction))

        let items = [flexSpace, done]
        doneToolbar.items = items
        doneToolbar.sizeToFit()

        self.inputAccessoryView = doneToolbar
    }

    func doneButtonAction()
    {
        self.resignFirstResponder()
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 很棒的答案。我希望每个人都向下滚动这里。 (4认同)

Jay*_*bey 14

您可以使用"完成"按钮将工具栏添加到键盘. InputAccessoryViewtextfield的属性可用于设置此工具栏.

下面是我在我的案例中使用过的代码

//Add done button to numeric pad keyboard
 let toolbarDone = UIToolbar.init()
 toolbarDone.sizeToFit()
 let barBtnDone = UIBarButtonItem.init(barButtonSystemItem: UIBarButtonSystemItem.Done,
         target: self, action: #selector(VerifyCardViewController.doneButton_Clicked(_:)))

 toolbarDone.items = [barBtnDone] // You can even add cancel button too
 txtCardDetails3.inputAccessoryView = toolbarDone
Run Code Online (Sandbox Code Playgroud)

截图


Mit*_*tim 8

我能找到的最简单的解决方案 - 适用于Swift 4.2 - 希望这有帮助:)

extension UITextField {

   func addDoneButtonOnKeyboard() {
       let keyboardToolbar = UIToolbar()
       keyboardToolbar.sizeToFit()
       let flexibleSpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace,
           target: nil, action: nil)
       let doneButton = UIBarButtonItem(barButtonSystemItem: .done,
           target: self, action: #selector(resignFirstResponder))
       keyboardToolbar.items = [flexibleSpace, doneButton]
       self.inputAccessoryView = keyboardToolbar
   }
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以在委托方法中处理完成的操作textFieldDidEndEditing,或者只是向扩展添加自定义方法并将其设置在doneButton.


Cod*_*224 5

如果您的Done按钮应该只关闭数字键盘,那么最简单的版本就是resignFirstResponder像这样调用选择器:

UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.Done, target: textField, action: #selector(UITextField.resignFirstResponder))
Run Code Online (Sandbox Code Playgroud)

此代码适用于iOS9和Swift 2,我在我的应用程序中使用它:

func addDoneButtonOnNumpad(textField: UITextField) {

  let keypadToolbar: UIToolbar = UIToolbar()

  // add a done button to the numberpad
  keypadToolbar.items=[
    UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.Done, target: textField, action: #selector(UITextField.resignFirstResponder)),
    UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FlexibleSpace, target: self, action: nil)
  ]
  keypadToolbar.sizeToFit()
  // add a toolbar with a done button above the number pad
  textField.inputAccessoryView = keypadToolbar
}
Run Code Online (Sandbox Code Playgroud)