Как добавить кнопку 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]; } }
Не уверен, что кому-то еще понадобится это хакерское решение, но я решил, что поставлю его там, если кому-то это нужно!
следующий мой подход, в 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.