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

52

ОБНОВИТЬ:

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

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

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

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


ОБНОВИТЬ:

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

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

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


self.myTextView.delegate = self;

А также:

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

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

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

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

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

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

Ваш Ответ

9   ответов
10

В вашем ViewController:

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

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

extension MyViewController: UITextFieldDelegate {        
    func textFieldShouldReturn(textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        return true
    }
}
Swift 4 сказал мне обновиться до `func textFieldShouldReturn (_ textField: UITextField) - & gt; Bool {`
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)
    }
}
117

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

[textField setReturnKeyType:UIReturnKeyDone];

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

textfield.delegate = self;

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

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

или же

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    [textField resignFirstResponder];
    return YES;
}
textFieldShouldReturn должен быть реализован, а неor, этоand
Благодарю. Я использовал UITextVieDelegate, и это работает. Один вопрос. Можно ли разрешить несколько строк, а также кнопку «Готово», чтобы закрыть клавиатуру? Я имею в виду, возможно ли иметь кнопки возврата и готово? Richard Knop
привет, вы должны быть в состоянии выяснить, что пошло не так. я отправил вам код для UITextField, а вы скопировали его для вашего UITextView, не меняя его. использоватьUITextField, воплощать в жизнь<UITextFieldDelegate> и используйте код, который я вам предоставил :) UITextView не может использовать UITextFieldDelegate, конечно. Однако вы можете использовать<UITextViewDelegate> протокол, если вы действительно хотите придерживаться textview. больше информации:developer.apple.com/library/ios/#documentation/uikit/reference/…
Я сделал все это и, нажав кнопку «Готово», просто вставил новую строку. Проверьте мой обновленный вопрос. Richard Knop
никогда не пробовал, но вы можете установить целое число в вашем классе, и каждый раз, когда кто-то входит в\n символ увеличивает счетчик, и когда вы нажимаете на максимум строк, вы уходите в отставку
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];
}
16

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

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

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

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

спасибо майк твой ответ помог мне в моем приложении. я проголосовал за тебя и спасибо. Адриан
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)
  }
Потрясающие!!! Это действительно великолепное решение.
0

textField.returnKeyType = UIReturnKeyDone;
-2

тип кнопки возврата на Готово.

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

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

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

Похожие вопросы