Добавить кнопку для скрытия клавиатуры

#ios #cocoa-touch #keyboard #uitextview

#iOS #cocoa-touch #клавиатура #uitextview

Вопрос:

В UITextView для скрытия клавиатуры существует метод:

 ...
    textfield.returnKeyType = UIReturnKeyDone;
    textfield.delegate = self;
....

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

}
  

но если я хочу оставить кнопку «готово» вместо «возврат» и добавить кнопку для скрытия клавиатуры, как мне это сделать?

Ответ №1:

Вы можете назначить панель инструментов с кнопкой, которая отключает клавиатуру от текстового поля inputAccessoryView . Быстрым примером может быть,

 UIBarButtonItem *barButton = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:textField action:@selector(resignFirstResponder)] autorelease];
UIToolbar *toolbar = [[[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)] autorelease];
toolbar.items = [NSArray arrayWithObject:barButton];

textField.inputAccessoryView = toolbar;
  

Комментарии:

1. Я вас не понял. Что вы хотите вызвать?

2. У меня есть метод, который сохраняет текст в базу данных [self saveString];

3. Вы всегда можете изменить целевое действие, чтобы вызвать метод, который отключает клавиатуру и вызывает [self saveString] .

4. это то, чего я не могу сделать: ( вы можете привести небольшой пример? большое спасибо!

5. Работает хорошо, но UIBarButtonItemStyleDone должен быть UIBarButtonSystemItemDone или на кнопке будет написано Редактировать.

Ответ №2:

Версия Swift 2.0:

 //Declared at top of view controller
var accessoryDoneButton: UIBarButtonItem!
let accessoryToolBar = UIToolbar(frame: CGRectMake(0,0,UIScreen.mainScreen().bounds.width, 44))
//Could also be an IBOutlet, I just happened to have it like this
let codeInput = UITextField()

//Configured in viewDidLoad()
self.accessoryDoneButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Done, target: self, action: #selector(self.donePressed(_:)))
self.accessoryToolBar.items = [self.accessoryDoneButton]
self.codeInput.inputAccessoryView = self.accessoryToolBar
  

Swift 4:

 //Declared at top of view controller
var accessoryDoneButton: UIBarButtonItem!
let accessoryToolBar = UIToolbar(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 44))
//Could also be an IBOutlet, I just happened to have it like this
let codeInput = UITextField()

//Configured in viewDidLoad()
self.accessoryDoneButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.done, target: self, action: #selector(self.donePressed))
self.accessoryToolBar.items = [self.accessoryDoneButton]
self.codeInput.inputAccessoryView = self.accessoryToolBar

func donePressed() {
    //Causes the view (or one of its embedded text fields) to resign the first responder status.
    view.endEditing(true)
}
  

Документация UIToolbar

Документация ‘inputAccessoryView’

Комментарии:

1. donePressed это просто функция в вашем UIViewController . Обычно я отказываюсь от активной клавиатуры первого ответчика, а затем извлекаю контроллер просмотра из стека навигации, если я того желаю.

Ответ №3:

Это можно сделать намного проще!

Я создал пользовательский вид в IB, в моем ViewController.h Я только что сделал IBOutlet UIView *accessoryView; , подключил их и - (IBAction)dismissKeyboard;

Я поместил в представление панель инструментов с кнопкой готово, установил соединение с IBAction и написал: [textView resignFirstResponder] и

 - (void)viewDidLoad
{
    textView.inputAccessoryView = accessoryView;
    [super viewDidLoad];
}
  

Но на самом деле это выглядит немного странно и не в стиле Apple… Есть идея?