Как добавить кнопку «Готово» на Numpad в iOS с помощью Swift?

Он отлично работает с клавиатурой по умолчанию, но я не могу заставить его работать с цифровой клавиатурой.

Любые идеи?


person Dejan Skledar    schedule 05.02.2015    source источник
comment
см. эту ссылку weheartswift.com/make-custom-keyboard- ios-8-using-swift   -  person Deepesh    schedule 05.02.2015
comment
Меня не интересует создание новой клавиатуры, я просто хочу добавить кнопку в UIToolBar, а затем добавить ее в textField как inputAccessoryView, как здесь: stackoverflow.com/a/11382044/3207979, но я еще не понял, как это сделать быстро ..   -  person Dejan Skledar    schedule 05.02.2015
comment
Вместо настраиваемой клавиатуры или панели инструментов мы можем добиться этого, добавив настраиваемую кнопку на клавиатуру по умолчанию. Обратитесь к этому ответу.   -  person Nazik    schedule 14.11.2017
comment
Для решения с использованием раскадровки https://stackoverflow.com/a/37896351/1465582   -  person Irshad Mohamed    schedule 29.08.2018


Ответы (12)


Насколько я знаю, вы не можете добавить кнопку «Готово» на клавиатуре; вам нужно добавить inputAccessoryView к UITextField или 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()
}

Swift 4.2

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

        txtMobileNumber.inputAccessoryView = doneToolbar
    }

    @objc func doneButtonAction(){
        txtMobileNumber.resignFirstResponder()
    }
person nikolovski    schedule 05.02.2015
comment
Отлично работает. Быстрая и простая реализация. Спасибо! - person Octavio Antonio Cedeño; 26.05.2017
comment
Вы можете изменить это, и вам не придется локализовать кнопку: let done: UIBarButtonItem = UIBarButtonItem (barButtonSystemItem: UIBarButtonSystemItem.done, target: self, action: #selector (self.doneButtonAction)) - person Zeezer; 10.06.2019

Версия Swift-3 (решения Марко - у меня сработало)

(в моем случае у меня есть 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()
}
person Adam Stoller    schedule 15.10.2016

Решение Swift 5 с использованием @IBInpectable и расширения. Выпадающий список появится под инспектором атрибутов в Интерфейсном разработчике для каждого UITextField в проекте.

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
    }

    @objc func doneButtonAction()
    {
        self.resignFirstResponder()
    }
}
person Dejan Atanasov    schedule 06.07.2017
comment
Фантастический ответ. Я надеюсь, что все здесь пролистывают. - person biomiker; 14.05.2020
comment
Именно то, что я искал. Спасибо - person king_T; 29.05.2021

Вы можете добавить панель инструментов с кнопкой Готово на клавиатуру. Свойство InputAccessoryView текстового поля можно использовать для установки этой панели инструментов.

Ниже приведен код, который я использовал в своем случае.

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

Снимок экрана

person Jayprakash Dubey    schedule 26.07.2016

Если ваша кнопка Done должна просто закрыть цифровую панель, то простейшим вариантом будет вызов resignFirstResponder в качестве селектора следующим образом:

UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.Done, target: textField, action: #selector(UITextField.resignFirstResponder))

Этот код работает в 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
}
person Coder1224    schedule 30.07.2016

Самое простое решение, которое я смог найти - работает с 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
   }
}

Затем вы можете обработать выполненное действие в методе делегата textFieldDidEndEditing или просто добавить собственный метод к расширению и установить его в селекторе doneButton.

person Mitemmetim    schedule 29.10.2019
comment
Отличное, простое и элегантное решение! - person MrMins; 21.05.2020

Поскольку приведенные выше ответы устарели в Xcode 11 и выше, начальная панель инструментов, такая как UIToolbar(), будет вызывать нарушение ограничения на консоли каждый раз, например здесь вы бежите, поэтому используйте UIToolbar(frame: CGRect(x: 0, y: 0, width: view.frame.size.width, height: 35)) вместо

Образец кода

            let toolBar =  UIToolbar(frame: CGRect(x: 0, y: 0, width: view.frame.size.width, height: 35))
            toolBar.barStyle = .default
            toolBar.sizeToFit()

            // Adding Button ToolBar
            let doneButton = UIBarButtonItem(title: "Done", style: .plain, target: self, action: #selector(doneButtonTapped))
            toolBar.items = [doneButton]
            toolBar.isUserInteractionEnabled = true
            textField.inputAccessoryView = toolBar
person SuryaKantSharma    schedule 08.02.2020
comment
Это работает, но как вы пришли к кадру 35? - person geohei; 12.09.2020
comment
Я думаю, это высота по умолчанию, возможно, вы можете настроить ее, чтобы изменить - person SuryaKantSharma; 12.09.2020
comment
Вы можете установить любое число (пробовали от 0 до 999). Похоже, это ничего не меняет. - person geohei; 01.10.2020

Прежде всего позвольте мне сказать вам одну вещь: вы можете ДОБАВИТЬ кнопку «Готово» на клавиатуре по умолчанию. Собственно сегодня я просто прошел через эту проблему и решил. Готовый код, просто поместите его в свой класс .swift. Я использую Xcode 7 и тестирую это на iPad Retina (ios 9).

В любом случае больше никаких разговоров, вот код.

  //Creating an outlet for the textfield
  @IBOutlet weak var outletTextFieldTime: UITextField!

  //Adding the protocol of UITextFieldDelegate      
  class ReservationClass: UIViewController, UITextFieldDelegate { 

  func textFieldShouldBeginEditing(textField: UITextField) -> Bool {
  //Making A toolbar        
  let keyboardDoneButtonShow = UIToolbar(frame: CGRectMake(0, 0,  self.view.frame.size.width, self.view.frame.size.height/17))
  //Setting the style for the toolbar
    keyboardDoneButtonShow.barStyle = UIBarStyle .BlackTranslucent        
  //Making the done button and calling the textFieldShouldReturn native method for hidding the keyboard.
  let doneButton = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.Done, target: self, action: Selector("textFieldShouldReturn:"))
  //Calculating the flexible Space.
    let flexSpace = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FlexibleSpace, target: nil, action: nil)
  //Setting the color of the button.
    item.tintColor = UIColor .yellowColor()
  //Making an object using the button and space for the toolbar        
  let toolbarButton = [flexSpace,doneButton]
  //Adding the object for toolbar to the toolbar itself
  keyboardDoneButtonShow.setItems(toolbarButton, animated: false)
  //Now adding the complete thing against the desired textfield
    outletTextFieldTime.inputAccessoryView = keyboardDoneButtonShow
    return true

}

//Function for hidding the keyboard.
func textFieldShouldReturn(textField: UITextField) -> Bool {
    self.view.endEditing(true)
    return false
   }
}

Что дает мне решение, как ...

введите здесь описание изображения

Еще одна вещь, которую я просто хочу вам сказать, это рабочее решение, которое я использовал в своем недавнем проекте. Я опубликовал это, потому что для этой проблемы нет рабочего решения. Рабочий код и объяснение, как и было обещано.

ИЗМЕНИТЬ: -

Делаем его более профессиональным ... Если вы следуете приведенному выше коду, он также даст вам рабочее решение, но здесь я пытаюсь сделать его более профессиональным. Обратите внимание на код MOD. Я оставил предыдущий неиспользованный код с цитатой.

Изменения..

  1. Создание отдельного объекта кнопки
  2. Установка его на панель инструментов
  3. Уменьшение размера созданной ранее панели инструментов
  4. Размещение настраиваемой кнопки слева от экрана с помощью FlexSpace и NegativeSpace.

    func textFieldShouldBeginEditing(textField: UITextField) -> Bool {
    let keyboardDoneButtonShow = UIToolbar(frame: CGRectMake(200,200, self.view.frame.size.width,30))
    
    // self.view.frame.size.height/17
    keyboardDoneButtonShow.barStyle = UIBarStyle .BlackTranslucent
    let button: UIButton = UIButton()
    button.frame = CGRectMake(0, 0, 65, 20)
    button.setTitle("Done", forState: UIControlState .Normal)
    button.addTarget(self, action: Selector("textFieldShouldReturn:"), forControlEvents: UIControlEvents .TouchUpInside)
    button.backgroundColor = UIColor .clearColor()
    // let doneButton = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.Done, target: self, action: Selector("textFieldShouldReturn:"))
    let doneButton: UIBarButtonItem = UIBarButtonItem()
    doneButton.customView = button
    let negativeSpace = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FixedSpace, target: nil, action: nil)
    negativeSpace.width = -10.0
    let flexSpace = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FlexibleSpace, target: nil, action: nil)
    //doneButton.tintColor = UIColor .yellowColor()
    let toolbarButton = [flexSpace,doneButton,negativeSpace]
    keyboardDoneButtonShow.setItems(toolbarButton, animated: false)
    outletTextFieldTime.inputAccessoryView = keyboardDoneButtonShow
    return true
    }
    

Теперь это дает мне следующее ... Кроме того, попробуйте сопоставить изображения и найти изменения.

введите здесь описание изображения

Спасибо.

Надеюсь, это помогло. Извините за долгий ответ.

person onCompletion    schedule 15.10.2015

Я бы использовал библиотеку под названием IQKeyboardManagerSwift.

Вам просто нужно вставить одну строку кода в метод AppDelegates didFinishWithLaunching, и он применяет все необходимые функции ко всем текстовым полям.

import IQKeyboardManagerSwift

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.
    //Following line is all you need and it applies for all TextFields
    IQKeyboardManager.shared.enable = true
    return true
}
person ilija.trkulja    schedule 06.02.2020

Согласно ответу Марко Николовски

Вот ответ на Objective-C:

- (void)ViewDidLoad {
[self addDoneButtonOnKeyboard];
}

- (void)addDoneButtonOnKeyboard {
UIToolbar *toolBarbutton = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 320, 50)];
toolBarbutton.barStyle = UIBarStyleBlackTranslucent;

UIBarButtonItem *barBtnItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
UIBarButtonItem *done = [[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStyleDone target:self action:@selector(doneButtonAction)];

NSMutableArray *items = [[NSMutableArray alloc] init];
[items addObject:barBtnItem];
[items addObject:done];

toolBarbutton.items = items;
[toolBarbutton sizeToFit];

self.timeoutTextField.inputAccessoryView = toolBarbutton;
}

- (void)doneButtonAction {
[self.view endEditing:YES];
}
person dicle    schedule 19.10.2016

Вы можете создать собственный класс. Я использую Swift 4:

class UITextFieldWithDoneButton: UITextField {
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        self.addDoneButtonOnKeyboard()
    }

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

    @objc fileprivate func doneButtonAction() {
        self.resignFirstResponder()
    }
}
person Kirill Kudaev    schedule 01.12.2018
comment
Это доставило мне удовольствие. Просто скопировал и вставил в конец файла .swift, а затем использовал: textfieldOutput.addDoneButtonOnKeyboard () в ViewDidLoad. Спасибо! - person David_2877; 20.09.2020

простой и легкий способ добавить кнопку «ГОТОВО» на любую клавиатуру - это добавить универсальную библиотеку

IQKeyboardManager

добавьте ниже код в appdelegate в приложении (_ application: UIApplication, didFinishLaunchingWithOptions.

IQKeyboardManager.shared.enable = true
IQKeyboardManager.shared.enableAutoToolbar = true
IQKeyboardManager.shared.keyboardDistanceFromTextField = 15
IQKeyboardManager.shared.shouldResignOnTouchOutside = true
person Hitesh Vora    schedule 17.01.2020