Как показать кнопку «Готово» на цифровой клавиатуре iPhone - PullRequest
229 голосов
/ 25 февраля 2009

На цифровой клавиатуре нет кнопки «Готово». Когда пользователь заканчивает ввод числовой информации в текстовое поле, как я могу заставить цифровую клавиатуру исчезнуть?

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

Ответы [ 21 ]

3 голосов
/ 11 сентября 2017

SWIFT 3.0 Другой вкус, используя части некоторых предыдущих ответов.

func addToolbarToNumberPad()
{
    let numberPadToolbar: UIToolbar = UIToolbar()

    numberPadToolbar.isTranslucent = true
    numberPadToolbar.items=[
        UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(self.cancelAction)),
        UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: self, action: nil),
        UIBarButtonItem(title: "Custom", style: .done, target: self, action: #selector(self.customAction)),
        UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(self.doneAction)),
    ]

    numberPadToolbar.sizeToFit()

    textField.inputAccessoryView = numberPadToolbar
}

func cancelAction()
{
    textField.resignFirstResponder()
}

func customAction()
{
    textField.resignFirstResponder()
}

func doneAction()
{
    textField.resignFirstResponder()
}

override func viewDidLoad()
{
    super.viewDidLoad()

    self.addToolbarToNumberPad()
}
3 голосов
/ 02 октября 2016

Если у вас есть несколько числовых полей, я предлагаю создать подкласс UITextField для создания NumericTextField, который всегда отображает цифровую клавиатуру с кнопкой готово. Затем просто свяжите ваши числовые поля с этим классом в Интерфейсном Разработчике, и вам не понадобится дополнительный код ни в одном из ваших контроллеров представления. Ниже приведен класс Swift 3.0, который я использую в Xcode 8.0.

class NumericTextField: UITextField {
   let numericKbdToolbar = UIToolbar()

    // MARK: Initilization
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        self.initialize()
    }

    override init(frame: CGRect) {
        super.init(frame: frame)
        self.initialize()
    }

    // Sets up the input accessory view with a Done button that closes the keyboard
    func initialize()
    {
        self.keyboardType = UIKeyboardType.numberPad

        numericKbdToolbar.barStyle = UIBarStyle.default
        let space = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.flexibleSpace, target: nil, action: nil)
        let callback = #selector(NumericTextField.finishedEditing)
        let donebutton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.done, target: self, action: callback)
        numericKbdToolbar.setItems([space, donebutton], animated: false)
        numericKbdToolbar.sizeToFit()
        self.inputAccessoryView = numericKbdToolbar
    }

    // MARK: On Finished Editing Function
    func finishedEditing()
    {
        self.resignFirstResponder()
    }
}

Swift 4.2

class NumericTextField: UITextField {
    let numericKbdToolbar = UIToolbar()

    // MARK: Initilization
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        self.initialize()
    }

    override init(frame: CGRect) {
        super.init(frame: frame)
        self.initialize()
    }

    // Sets up the input accessory view with a Done button that closes the keyboard
    func initialize()
    {
        self.keyboardType = UIKeyboardType.numberPad

        numericKbdToolbar.barStyle = UIBarStyle.default
        let space = UIBarButtonItem(barButtonSystemItem: UIBarButtonItem.SystemItem.flexibleSpace, target: nil, action: nil)
        let callback = #selector(NumericTextField.finishedEditing)
        let donebutton = UIBarButtonItem(barButtonSystemItem: UIBarButtonItem.SystemItem.done, target: self, action: callback)
        numericKbdToolbar.setItems([space, donebutton], animated: false)
        numericKbdToolbar.sizeToFit()
        self.inputAccessoryView = numericKbdToolbar
    }

    // MARK: On Finished Editing Function
    @objc func finishedEditing()
    {
        self.resignFirstResponder()
    }
}
2 голосов
/ 16 мая 2013

Если вы заранее знаете количество вводимых чисел (например, 4-значный PIN-код), вы можете автоматически отклонить его после 4 нажатий клавиш, как указано в моем ответе на этот похожий вопрос:

отклонение цифровой клавиатуры

В этом случае не требуется дополнительная кнопка Готово.

2 голосов
/ 24 апреля 2011

Я описываю одно решение для iOS 4.2+ здесь , но кнопка отклонения исчезает после появления клавиатуры. Это не ужасно, но и не идеально.

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

2 голосов
/ 26 июня 2012

Самый простой способ :

Создайте настраиваемую прозрачную кнопку и поместите ее в левый нижний угол, который будет иметь то же значение CGSize, что и пустое пространство в UIKeyboardTypeNumberPad. Переключить (показать / скрыть) эту кнопку на textField becomeFirstResponder, при нажатии кнопки соответственно.

2 голосов
/ 12 сентября 2012

Вот самое простое решение, с которым я столкнулся. Я узнал об этом из книги «Начало разработки iOS 5.»

Предполагается, что числовое поле называется numberField.

  1. В ViewController добавьте следующий метод:

    -(IBAction)closeKeyboard:(id)sender;
    
  2. В ViewController.m добавить следующий код:

    -(IBAction)closeKeyboard:(id)sender
    {
    
         [numberField resignFirstResponder];
    
    }
    
  3. Вернуться к nib файлу.

  4. Открыть Utilities Пан.
  5. Откройте Identity inspector в области Utilities.
  6. Нажмите на View (в файле пера) один раз. Убедитесь, что вы не нажали ни на один из элементов в представлении. Для ясности, вы должны увидеть UIView под Class в Identity inspector.
  7. Измените класс с UIView на UIControl.
  8. Открыть Connection Inspector.
  9. Нажмите и перетащите Touch Down и поместите стрелку на значок File Owner. (FYI ... Значок владельца файла отображается слева от View и отображается как полый куб с желтой рамкой.)
  10. Выберите метод: closeKeyboard.
  11. Запустите программу.

Теперь, когда вы щелкнете где-нибудь на фоне View, вы сможете отклонить клавиатуру.

Надеюсь, это поможет вам решить вашу проблему. : -)

2 голосов
/ 07 мая 2015

Мы также можем сделать решение "пользователь тронулся где-то еще" еще проще, если мы просто скажем представлению нашего контроллера представления закончить редактирование:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
 { 
      [super touchesBegan:touches withEvent:event];

      [self.view endEditing:YES]; //YES ignores any textfield refusal to resign
 }

... при условии, что "прикосновение к чему-либо другому приводит к отклонению клавиатуры" - желаемое поведение для любых других редактируемых полей в представлении.

2 голосов
/ 04 октября 2012

Я изменил решение Брайана, чтобы оно было немного более надежным, чтобы оно хорошо сочеталось с другими типами клавиатур, которые могут появляться в том же виде. Это описано здесь:

Создать кнопку «Готово» на iOS numpad UIKeyboard

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

1 голос
/ 04 мая 2016

Для Swift 2.2 я использую это

func addDoneButtonOnKeyboard() {
    let doneToolbar: UIToolbar = UIToolbar(frame: CGRectMake(0, 0, self.view.bounds.size.width, 50))

    let flexSpace = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FlexibleSpace, target: nil, action: nil)
    let done: UIBarButtonItem = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.Done, target: self, action: #selector(DetailViewController.finishDecimalKeypad))

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

    doneToolbar.items = items
    doneToolbar.sizeToFit()
    self.productPrice.inputAccessoryView=doneToolbar
}

func finishDecimalKeypad() {
    self.productPrice?.resignFirstResponder()
}
0 голосов
/ 23 августа 2016

Swift 2.2 / Я использовал ответ Dx_. Тем не менее, я хотел эту функциональность на всех клавиатурах. Итак, в моем базовом классе я поставил код:

func addDoneButtonForTextFields(views: [UIView]) {
    for view in views {
        if let textField = view as? UITextField {
            let doneToolbar = UIToolbar(frame: CGRectMake(0, 0, self.view.bounds.size.width, 50))

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

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

            doneToolbar.items = items
            doneToolbar.sizeToFit()

            textField.inputAccessoryView = doneToolbar
        } else {
            addDoneButtonForTextFields(view.subviews)
        }
    }
}

func dismissKeyboard() {
    dismissKeyboardForTextFields(self.view.subviews)
}

func dismissKeyboardForTextFields(views: [UIView]) {
    for view in views {
        if let textField = view as? UITextField {
            textField.resignFirstResponder()
        } else {
            dismissKeyboardForTextFields(view.subviews)
        }
    }
}

Затем просто вызовите addDoneButtonForTextFields для self.view.subviews в viewDidLoad (или willDisplayCell, если используется табличное представление), чтобы добавить кнопку «Готово» ко всем клавиатурам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...