2015-04-24 2 views
7

У меня есть textView, прикрепленный к нижней части окна. Тем не менее, клавиатура не будет отклонена, когда пользователь удаляется за пределы commentTextView.inputAccessoryView Dismiss Keyboard

Текущая попытка:

import UIKit 
class CommentsViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 

    @IBOutlet var commentBar: UIView! 

    @IBOutlet var commentTextField: UITextField! 

    override var inputAccessoryView: UIView { 
     return commentBar 
    } 

    override func canBecomeFirstResponder() -> Bool { 
     commentBar.removeFromSuperview() 
     return true 
    } 

    func textFieldShouldReturn(textField: UITextField!) -> Bool { 
     self.view.endEditing(true); 
     return false; 
    } 

    override func touchesBegan(touches: NSSet, withEvent event: UIEvent) { 
     self.view.endEditing(true); 
     commentTextField.resignFirstResponder() 
    } 
+0

Вы получаете доступ к комментариюTextField и в вопросе вы сообщаете textview. Не могли бы вы подтвердить? – techloverr

ответ

-1

Попробуйте

override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) { 
    self.view.endEditing(true); 
    commentTextField.resignFirstResponder() 
} 
+0

Получил ошибку: 'использование необъявленного типа" set "' – Onichan

+1

@Emma это новый тип коллекции в Swift 1.2, чтобы заменить Objective-C 'NSSet'. – vrwim

1

вы добавили Table View?

если да, tableViewCell получит событие касания вместо controller.view.

можно переопределить метод в пользовательской Tableview ячейке:

override func hitTest(point: CGPoint, withEvent event: UIEvent?) -> UIView? { 
     if (xxTextField.isFirstResponder){ 
      return viewController.view 
     } 
    return self 
} 

Другим способом вы можете попробовать, может быть, это работает:

добавить UITapGestureRecognizer к controller.view.

+0

Это правильно, есть табличка. При использовании метода hitTest я получаю 'Метод не отменяет какой-либо метод из своего суперкласса' – Onichan

+0

@ Emma, ​​вы должны переопределить в свой' UITableViewCell', а не 'UIViewController'. – nathanwhy

1

Когда вы говорите «вне моего UITextField», я предполагаю, что вы имеете в виду «на другом элементе в моем представлении». Я вижу, что у вас есть UITableViewDelegate и UITableViewDataSource, в котором говорится, что у вас есть tableView внутри CommentsViewController.

Вы можете реализовать функцию func tableView(_ tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) и там вы можете уволиться клавиатуры по телефону commentTextField.resignFirstResponder()

+0

Я попробовал его с ответом @ yuchen, но он не ушел с клавиатуры. – Onichan

6

Согласно документации Apple, клавиатура не уволят по умолчанию, когда пользователь нажимает вне UITextView. Вам необходимо обращаться с этим программным способом, когда вы хотите отклонить клавиатуру, позвонив по номеру commentTextField.resignFirstResponder().

UITextFiled Reference about Managing the Keyboard

It is your application’s responsibility to dismiss the keyboard at the time of your choosing. You might dismiss the keyboard in response to a specific user action, such as the user tapping a particular button in your user interface. To dismiss the keyboard, send the resignFirstResponder message to the text view that is currently the first responder.

Есть много способов для пользователя может скрыть клавиатуру.

Ситуация 1: один, когда пользователь нажмите на кнопкуReturn на клавиатуре. Это именно то, что ваша следующая функция для:

func textFieldShouldReturn(textField: UITextField!) -> Bool { 
    commentTextField.resignFirstResponder(); 
    return true; 
} 

Но главная проблема заключается в том, что данная функция не будет вызвана, потому что вы забыли установить UITextFieldDelegate. Короче говоря, вам необходимо изменить определение класса на следующее:

class CommentsViewController: UIViewController, UITextFieldDelegate /*Add This*/, UITableViewDelegate, UITableViewDataSource { 
    // .... 
} 

Вы также должны установить удалить либо в раскадровке или кодом. Это то же самое, что и установка UITableViewDelegate и UITableViewDataSource. К Ниже приводится пример установки его в коде:

override func viewDidLoad() { 
    super.viewDidLoad() 
    commentTextField.delegate = self; 
} 

Ситуация 2: когда пользователь нажмите на табличном. Вы можете просто реализовать следующее UITableViewDelegate, и оно должно работать.

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
    commentTextField.resignFirstResponder(); 
} 

Ситуация 3: когда пользователь крана на фоне зрения. Для этого нужен следующий код. Однако эта функция не будет вызвана, когда пользователь коснется таблицы. Если вы хотите знать, почему, пожалуйста, обратитесь к responder chain за дополнительной информацией.

override func touchesBegan(touches: NSSet, withEvent event: UIEvent) { 
    // self.view.endEditing(true); // This line is redundant. 
    commentTextField.resignFirstResponder() 
} 

Подводя итог, нет быстрый и простой способ, чтобы закрыть клавиатуру сказать «когда пользователь нажимает вне TextView». Вам необходимо обрабатывать все различные ситуации в соответствии с вашими потребностями.

enter image description here

+0

Благодарим вас за инструкции. Я попробовал это, но клавиатура все еще не исчезает, даже если я нажму «return» или коснитесь tableView. – Onichan

+0

@Emma, ​​я думаю, ваш 'commentBar' может быть проблематичным. Не могли бы вы попытаться удалить это и посмотреть, как это работает? Чтение [Руководство по программированию текста] (https://developer.apple.com/library/ios/documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/InputViews/InputViews.html), я не уверен, будет ли это работать или нет, возвращая IBOutLet для inputAccessoryView. –

+0

даже при использовании только текстового поля и удаления комментарияBar, у меня такая же проблема. Я также попробовал добавить делегата TextField к классу и установить его в self в viewDidLoad. – Onichan

2

Попытка установить клавиатуру уволиться на вашем Tableview, как показано на рисунке.

проверка любой -dismiss на сопротивление -dismiss интерактивно

Set keyboard release on tableview interations

+0

Отклонение в интерактивном режиме, похоже, не влияет.Тем не менее, увольнение на перетаскивание отменяет клавиатуру. Как я могу активировать интерактивную работу? – Onichan

+0

Dismss on drag: при перетаскивании таблицы вверх или вниз клавиатура быстро увольняется Отклонитесь от случая к случаю: когда вы перетаскиваете табличную клавиатуру вниз, медленно уменьшайте свою интенсивность драпировки, точно так же, как вы делаете жест панорамы, чтобы переместить клавиатуру вниз. –

1

Во-первых, ваш контроллер представления необходимо реализовать UITextFieldDelegate, так что добавить. Затем установите контроллер представления в качестве делегата для TextField

enter image description here

затем добавить эти методы. Первый будет resignFirstResponder, когда ваше текстовое поле закончит редактирование. Второй уходит в отставку, когда вы возвращаетесь. Последнее заставляет ваше текстовое поле заканчивать редактирование при нажатии фона.

func textFieldDidEndEditing(textField: UITextField) { 
    textField.resignFirstResponder() 
} 

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

override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) { 
    self.commentTextField.endEditing(true) 
} 
1

Изменить

override func touchesBegan(touches: NSSet, withEvent event: UIEvent) { 
     self.view.endEditing(true); 
     commentTextField.resignFirstResponder() 
    } 

Для

override func touchesBegan(touches: NSSet, withEvent event: UIEvent) { 
     super.touchesBegan(touches, withEvent: event) 
     self.view.endEditing(true) 
    } 

Он должен делать эту работу.

Смежные вопросы