52

Вопрос по xcode, iphone, ios, objective-c – Как добавить кнопку «Готово» на клавиатуре?

ОБНОВИТЬ:

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

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

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

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


ОБНОВИТЬ:

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

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

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


self.myTextView.delegate = self;

А также:

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

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

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

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

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

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

Apr 09, 2012, 5:57 PMот

@joerick Проверьте мое последнее обновление (в верхней части моего сообщения). Я перепробовал все, вашу ссылку (и другие), а также все ответы, размещенные на этой странице. Нажатие Готово все еще только добавляет новую строку :(

Apr 09, 2012, 9:51 PMот

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

Apr 09, 2012, 5:55 PMот

@joerick Я обновил свой вопрос.

Apr 09, 2012, 6:01 PMот

9ответов

0

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

textField.returnKeyType = UIReturnKeyDone;
16

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

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

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

Затем вернитесь в свое текстовое поле, нажмите «Магазины» и ссылку «Закончилось ли при выходе». отклонить действие клавиатуры.

0

Вот мой подход, в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)
    }
}
1

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

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

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

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

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

13

Add UIToolBar as custom view that will have Done button as UIBarButtonItem in it.

This is safer and cleaner way to add Done button to any Type of Keyboard. Create UIToolBar add Done Button to it and set inputAccessoryView of any UITextField or 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

Function

  @IBAction func doneBtnFromKeyboardClicked (sender: Any) {
     print("Done Button Clicked.")
    //Hide Keyboard by endEditing or Anything you want.
    self.view.endEditing(true)
  }
117

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

[textField setReturnKeyType:UIReturnKeyDone];

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

textfield.delegate = self;

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

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

или же

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

В Интерфейсном Разработчике на свойствах textView вы можете установить тип кнопки возврата на Готово.

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

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

Убедитесь, что текст == & quot; / n & quot; затем отклоните клавиатуру, оставив первого респондента на вашем textView.

10

Swift версия:

В вашем ViewController:

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

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

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

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

[textField becomeFirstResponder];
[textField resignFirstResponder];

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

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

RelatedQuestions