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

обновление:

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

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

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

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


обновление:

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

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

затем я сделал:


self.myTextView.delegate = self;

и:

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

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

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

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

как я могу добавить кнопку "Готово" на клавиатуру, чтобы ее можно было отклонить?

9 ответов


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

[textField setReturnKeyType:UIReturnKeyDone];

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

textfield.delegate = self;

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

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

или

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

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

затем зайдите в свой ViewController и добавьте:

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

затем вернитесь к текстовому полю, нажмите outlets и ссылку "did end on exit" для действия dismissKeyboard.


добавить 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 Для Кнопки Готово

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

Swift версия:

В Вашем ViewController:

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

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

extension MyViewController: UITextFieldDelegate {        
    func textFieldShouldReturn(textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        return true
    }
}

установить под в инспекторе для вашего текстового поля. Затем щелкните правой кнопкой мыши на текстовом поле и, удерживая CTRL выберите 'Did End On Exit' и перетащите это в ваш . Это создаст IBAction метод. Дайте методу имя, а затем введите следующие значения:

[textField becomeFirstResponder];
[textField resignFirstResponder];

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

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

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

-(типа bool)текстовое представление:(UITextView *)поле TextView shouldChangeTextInRange:(NSRange)диапазон replacementText:(NSString *)текст

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

// 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];
    }
}

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


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

textField.returnKeyType = UIReturnKeyDone;

следующий мой подход, в 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)
    }
}

в Interface Builder в свойствах textView вы можете установить тип кнопки возврата в Done.

затем вам нужно проверить, когда кнопка возврата нажата с помощью

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

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