Як додати кнопку «Готово» до Numpad в iOS за допомогою Swift?


79

Він чудово працює з клавіатурою за замовчуванням, але я не можу змусити його працювати з цифровою панеллю.

Будь-які ідеї?



2
Мені не цікаво створювати нову клавіатуру, я просто хочу додати кнопку до панелі UIToolBar, а потім додати її до textField як inputAccessoryView, як тут: stackoverflow.com/a/11382044/3207979 , але я цього не зрозумів ще, як це зробити швидко ..
Деян Скледар

Замість власної клавіатури або панелі інструментів ми можемо досягти цього, додавши спеціальну кнопку на клавіатуру за замовчуванням. Зверніться до цієї відповіді .
Назік

Для рішення за допомогою розкадровки https://stackoverflow.com/a/37896351/1465582
Іршад Мохамед,

Відповіді:


100

Наскільки мені відомо, ви не можете додати кнопку Готово на клавіатурній частині; вам слід додати знак 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()
}

Свіфт 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()
    }

Працює ідеально. Швидка та проста реалізація. Дякую!
Октавіо Антоніо Седеньо

3
Ви можете перейти на це, і вам не доведеться локалізувати кнопку: нехай буде зроблено: UIBarButtonItem = UIBarButtonItem (barButtonSystemItem: UIBarButtonSystemItem.done, target: self, action: #selector (self.doneButtonAction))
Zeezer

59

Версія 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()
}

48

Рішення 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()
    }
}

3
Фантастична відповідь. Сподіваюся, тут усі прокручують.
біомайкер

15

Ви можете додати панель інструментів за допомогою кнопки Готово на клавіатуру. InputAccessoryViewвластивість textfield можна використовувати для встановлення цієї панелі інструментів.

Нижче наведено код, який я використовував у своєму випадку

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

Знімок екрана


5

Якщо ваша 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
}

4

Найпростіше рішення, яке я міг знайти - працює з 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.


Відмінне, просте та елегантне рішення!
MrMins

3

Перш за все дозвольте мені сказати одне, що Ви можете ДОДАТИ Готову кнопку на Вашій клавіатурі за умовчанням. Насправді сьогодні я просто пройшов через цю проблему і вирішив. Готовий код, просто розмістіть його у своєму класі .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
    }
    

Зараз це дає мені таке ... Більше того, спробуйте підібрати малюнки та знайти зміни.

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

Дякую.

Сподіваюся, це допомогло. Вибачте за довгу відповідь.


3

Оскільки наведені вище відповіді застарілі в 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

Це працює, але як ви придумали кадр із 35?
geohei

1
Я думаю, що це висота за замовчуванням, можливо, ви можете налаштувати її на зміну
SuryaKantSharma

Ви можете встановити будь-яке число (спробували від 0 до 999). Здається, це, здається, нічого не змінює.
geohei

2

Відповідно до відповіді Марко Ніколовського

Ось відповідь-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];
}

2

Ви можете створити власний клас. Я використовую 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()
    }
}

1
Це спрацювало для мене задоволення. Просто скопіюйте та вставте внизу файлу .swift, а потім використовуйте: textfieldOutput.addDoneButtonOnKeyboard () у ViewDidLoad. Дякую!
David_2877

2

Я б використовував бібліотеку, що викликає IQKeyboardManagerSwift .

Вам просто потрібно вставити один рядок коду в метод AppDelegates didFinishWithLaunching, і він застосовує всі необхідні функції до всіх TextFields.

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
}

0

простий і простий спосіб додати кнопку "ГОТОВО" на будь-яку клавіатуру - це додати універсальну бібліотеку

IQKeyboardManager

додати нижче код в appdelegate у додатку (_ application: UIApplication, didFinishLaunchingWithOptions.

IQKeyboardManager.shared.enable = true
IQKeyboardManager.shared.enableAutoToolbar = true
IQKeyboardManager.shared.keyboardDistanceFromTextField = 15
IQKeyboardManager.shared.shouldResignOnTouchOutside = true
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.