Как добавить кнопку Готово на клавиатуру?

ОБНОВИТЬ:

Я также попытался реализовать делегат UITextViewDelegate, а затем сделал в своем контроллере:

- (BOOL)textViewShouldEndEditing:(UITextView *)textView
{
    [textView resignFirstResponder];
    return YES;
}

Я также установил делегата текстового представления как self (экземпляр представления контроллера).

Нажатие кнопки Готово по-прежнему вставляет только новую строку :(


ОБНОВИТЬ:

Что я сделал до сих пор. Я реализовал UITextFieldDelegate своим контроллером представления.

Я подключил текстовое представление к контроллеру представления через розетку.

Тогда я сделал:


self.myTextView.delegate = self;

И:

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [textField resignFirstResponder];
    return YES;
}

Но когда я нажимаю кнопку «Готово», она просто добавляет новую строку.

Итак, у меня есть элемент UITextView на моей сцене, и когда пользователь нажимает на него, появляется клавиатура, и ее можно редактировать.

Однако я не могу убрать клавиатуру.

Как добавить на клавиатуру кнопку «Готово», чтобы ее можно было закрыть?


person Richard Knop    schedule 09.04.2012    source источник
comment
@joerick Я пробовал вашу ссылку. Когда я нажимаю кнопку «Готово», она просто вставляет новую строку.   -  person Richard Knop    schedule 09.04.2012
comment
Покажи нам, что у тебя есть на данный момент; опубликуйте код, который вы используете в данный момент, и тогда мы увидим, что вы делаете не так.   -  person joerick    schedule 09.04.2012
comment
@joerick Я обновил свой вопрос.   -  person Richard Knop    schedule 09.04.2012
comment
@joerick Проверьте мое последнее обновление (поверх моего сообщения). Я перепробовал все, вашу ссылку (и другие) и все ответы, размещенные на этой странице. Нажатие Готово по-прежнему просто добавляет новую строку :(   -  person Richard Knop    schedule 10.04.2012


Ответы (9)


это довольно просто :)

[textField setReturnKeyType:UIReturnKeyDone];

для отклонения клавиатуры реализовать протокол <UITextFieldDelegate> в вашем классе, установите

textfield.delegate = self;

и использовать

- (void)textFieldDidEndEditing:(UITextField *)textField {
    [textField resignFirstResponder];
}

or

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    [textField resignFirstResponder];
    return YES;
}
person Sebastian Flückiger    schedule 09.04.2012
comment
Я сделал все это, и нажатие кнопки «Готово» по-прежнему просто вставляет новую строку. Проверьте мой обновленный вопрос. - person Richard Knop; 10.04.2012
comment
привет, ты должен понять, что пошло не так. Я разместил вам код для UITextField, и вы скопировали его для своего UITextView, не меняя его. используйте UITextField, реализуйте <UITextFieldDelegate> и используйте код, который я вам предоставил :) UITextView, конечно, не может использовать UITextFieldDelegate. однако вы можете использовать протокол <UITextViewDelegate>, если действительно хотите придерживаться текстового представления. дополнительная информация: developer.apple.com/ библиотека / ios / # documentation / uikit / reference / - person Sebastian Flückiger; 10.04.2012
comment
Спасибо. Я использовал UITextVieDelegate, и он работает. Один вопрос. Можно ли разрешить несколько строк, а также иметь кнопку «Готово» для закрытия клавиатуры? Я имею в виду, можно ли иметь одновременно кнопки возврата и завершения? - person Richard Knop; 10.04.2012
comment
никогда не пробовали, но вы можете установить целое число в своем классе, и каждый раз, когда кто-то вводит символ \n, увеличивайте счетчик, и когда вы достигнете максимального количества строк, вы отказываетесь от первого респондента - person Sebastian Flückiger; 11.04.2012
comment
textFieldShouldReturn должен быть реализован, а не or, это and - person ideawu; 14.01.2015
comment
@ideawu optional func textFieldShouldReturn(_ textField: UITextField) -> Bool. это необязательно. если он не нужен, не применяйте его. - person Sebastian Flückiger; 14.01.2015
comment
@ SebastianFlückiger, если вы не реализуете textFieldShouldReturn и не вернете YES, textFieldDidEndEditing не будет вызван. Я весьма уверен. - person ideawu; 14.01.2015
comment
это необязательная функция по определению :) - person Sebastian Flückiger; 15.01.2015
comment
В быстром режиме это не работает self.textField.returnKeyType = UIReturnKeyType.done; - person Return-1; 15.09.2017
comment
Для меня он работает только с textFieldShouldReturn, нет необходимости в textFieldDidEndEditing. Написание на Swift 4.1 - person Andrea Gorrieri; 04.06.2018

Зайдите в раскадровку, выберите текстовое поле и в Инспекторе атрибутов есть опция, которая гласит «ключ возврата» ... выберите «Готово».

Затем перейдите в свой ViewController и добавьте:

- (IBAction)dismissKeyboard:(id)sender;
{
    [textField becomeFirstResponder];
    [textField resignFirstResponder];
}

Затем вернитесь в свое текстовое поле, нажмите «Выходы» и ссылку «Завершился при выходе», чтобы отклонить действие клавиатуры.

person Mike Z    schedule 09.04.2012
comment
спасибо, Майк, твой ответ помог мне в моем приложении. я дал вам голос и спасибо. Адриан - person Adrian P; 26.12.2012

Добавьте UIToolBar в качестве настраиваемого представления, в котором кнопка «Готово» будет отображаться как UIBarButtonItem.

Это более безопасный и понятный способ добавить кнопку «Готово» к любому типу клавиатуры. Создайте UIToolBar, добавьте к нему кнопку «Готово» и установите inputAccessoryView для любого UITextField или UITextView.

UIToolbar *ViewForDoneButtonOnKeyboard = [[UIToolbar alloc] init];
[ViewForDoneButtonOnKeyboard sizeToFit];
UIBarButtonItem *btnDoneOnKeyboard = [[UIBarButtonItem alloc] initWithTitle:@"Done"
                                                               style:UIBarButtonItemStyleBordered target:self
                                                              action:@selector(doneBtnFromKeyboardClicked:)];
[ViewForDoneButtonOnKeyboard setItems:[NSArray arrayWithObjects:btnDoneOnKeyboard, nil]];

myTextField.inputAccessoryView = ViewForDoneButtonOnKeyboard;

IBAction For Done Button

 - (IBAction)doneBtnFromKeyboardClicked:(id)sender
  {
      NSLog(@"Done Button Clicked.");

      //Hide Keyboard by endEditing or Anything you want.
      [self.view endEditing:YES];
  }

SWIFT 3

var ViewForDoneButtonOnKeyboard = UIToolbar()
ViewForDoneButtonOnKeyboard.sizeToFit()
var btnDoneOnKeyboard = UIBarButtonItem(title: "Done", style: .bordered, target: self, action: #selector(self.doneBtnFromKeyboardClicked))
ViewForDoneButtonOnKeyboard.items = [btnDoneOnKeyboard]
myTextField.inputAccessoryView = ViewForDoneButtonOnKeyboard

Функция

  @IBAction func doneBtnFromKeyboardClicked (sender: Any) {
     print("Done Button Clicked.")
    //Hide Keyboard by endEditing or Anything you want.
    self.view.endEditing(true)
  }
person ViJay Avhad    schedule 19.08.2016
comment
В Xcode 11.2, построенном для iOS 12, я получаю сбой автоматического размещения, если я не использовал let ViewForDoneButtonOnKeyboard = UIToolbar(frame: CGRect(x: 0.0, y: 0.0, width: 500.0, height: 70)). CGRect совершенно произвольно, но Xcode выгрузил строку: <NSAutoresizingMaskLayoutConstraint:0x283c6ff70 h=--& v=--& _UIToolbarContentView:0x102c5e7f0.width == 0 (active)>, поэтому предоставление ширины, похоже, исправило это - person Todd; 25.11.2019

Быстрая версия:

В вашем ViewController:

textField.returnKeyType = UIReturnKeyType.Done
textField.delegate = self

После вашего ViewController

extension MyViewController: UITextFieldDelegate {        
    func textFieldShouldReturn(textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        return true
    }
}
person Esqarrouth    schedule 06.10.2015
comment
Swift 4 сказал мне обновить до `func textFieldShouldReturn (_ textField: UITextField) -› Bool {` - person user2161301; 01.05.2018

Установите параметр 'Return Key' под параметром text field в инспекторе для вашего текстового поля. Затем щелкните правой кнопкой мыши текстовое поле и, удерживая CTRL, выберите 'Did End On Exit' и перетащите его в свой view controllers файл. Это создаст IBAction метод. Дайте методу имя, а затем введите следующие значения:

[textField becomeFirstResponder];
[textField resignFirstResponder];

Ваш метод должен выглядеть так:

- (IBAction)methodName:(id)sender;
{
    [sender becomeFirstResponder];
    [sender resignFirstResponder];
}
person Garreth Golding    schedule 04.04.2013

Хорошо, я тоже борюсь с этой проблемой. В настоящее время я обращаюсь к UITextView в UITableViewCell (через теги). Поскольку я использую прототипы ячеек, я не могу использовать ни IBActions, ни IBOutlets, как все предлагают. Вместо этого я использую;

- (BOOL) textView: (UITextView *) textView shouldChangeTextInRange: (NSRange) range replaceText: (NSString *) текст

Затем это будет предоставлять мне текст каждый раз, когда пользователь нажимает кнопку. Мое решение заключалось в том, чтобы получить символ ascii для новой строки; "/ п". Если это был введенный текст, я бы отказался от первого респондента. Например;

// If the text length is 0 then the user is deleting something, so only check the ascii character if there is text to check
if (text.length != 0) {
    // Get the Ascii character
    int asciiCode = [text characterAtIndex:0];
    // If the ascii code is /n or new line, then resign first responder
    if (asciiCode == 10) {
        [alertTextView resignFirstResponder];
        [DeviceTextView resignFirstResponder];
    }
}

Не уверен, понадобится ли это хакерское решение кому-нибудь еще, но я решил, что выложу его на случай, если кому-то это понадобится!

person Donato Perconti    schedule 30.01.2014

Это лучший способ добавить кнопку "Готово" на клавиатуру.

textField.returnKeyType = UIReturnKeyDone;
person DURGESH    schedule 04.07.2016

Ниже приводится мой подход в Swift 3. Когда doneBtn щелкнул, пусть он отправит .editingDidEndOnExit событие. Я использую это событие для решения проблемы с фокусом между несколькими текстовыми полями.

// My customized UITextField
class MyTextField: UITextField {

    override func awakeFromNib() {
        super.awakeFromNib()

        // Add toolBar when keyboardType in this set. 
        let set : [UIKeyboardType] = [.numberPad, .phonePad]
        if (set.contains(self.keyboardType) ) {
            self.addDoneToolbar()
        }
    }

    // Add a toolbar with a `Done` button
    func addDoneToolbar() {

        let toolbar = UIToolbar()
        let space = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: self, action: nil)
        let doneBtn = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(onToolBarDone))

        toolbar.items = [space, doneBtn]
        toolbar.sizeToFit()

        self.inputAccessoryView = toolbar
    }

    @objc func onToolBarDone() {
        // I use `editingDidEndOnExit` to simulate the `Done` behavior 
        // on the original keyboard.
        self.sendActions(for: .editingDidEndOnExit)
    }
}
person AechoLiu    schedule 25.01.2018

В Interface Builder в свойствах textView вы можете установить для типа кнопки возврата значение «Готово».

Затем вам нужно проверить, когда нажата кнопка возврата, используя

  - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text

Проверьте, есть ли text == "/ n", затем отключите клавиатуру, уволив первого респондента на вашем textView.

person Ryan Poolos    schedule 09.04.2012