2015-04-03 2 views
1

Я здесь noob и в мире iOS. У меня проблемы с клавиатурой в конкретном случае в моем очень простом списке приложений iOS.Как убрать клавиатуру с несколькими UITextField

Я бы хотел, чтобы клавиатура была убрана, когда пользователь удаляет теги вне текущего текстового поля или самой клавиатуры. До сих пор я просто прекратил клавиатуру (спасибо вам, ребята, в переполнении стека), когда пользователь нажимает на UITableView или большинство элементов моего приложения. HOWEVER, Когда пользователь нажимает на другой UITextField, клавиатура не исчезает.

FYI, вот список существующих тем, которые я исследовал до сих пор, но еще не решил эту проблему. 1) How to dismiss keyboard iOS programmatically 2) Resigning First Responder for multiple UITextFields 3) Dismissing the First Responder/Keyboard with multiple Textfields 4) (несколько больше, по крайней мере, но я потерял :()

Вот что я сделал до сих пор:

(in viewDidLoad()) 
// Add 'tap' gesture to dismiss keyboard when done adding/editing to-do item 
var tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "tapOutside:") 
tap.cancelsTouchesInView = true 
self.view.addGestureRecognizer(tap) 

func tapOutside(tapOutside: UIGestureRecognizer) { 
    // Dismiss keyboard 
    self.view.endEditing(true) 
} 

@IBAction func EditingDidBegin(sender: UITextField) { 
    // Highlight the text field which user is editing 
    self.highlightTextField(sender, highlight: true) 
} 

@IBAction func EditingDidEnd(sender: UITextField) { 
    // Undo text field highlight 
    self.highlightTextField(sender, highlight: false) 

    self.view.endEditing(true) // try this option and not working 
    self.setEditing(false, animated: true) // try this option and not working 
    sender.resignFirstResponder() // try this option and not working 
    UIApplication.sharedApplication().becomeFirstResponder() // try this option and not working 

    ... // below is my code to update the todo item 
} 

Я также попытался распечатайте все subviews.isFirstResponder() моего представления. Все это возвращает false. Я также попробовал переопределить touchsBegan моего UIViewController, а внутри него просто вызывает self.view.endEditing (true) и вызывает его супер. Это также не работает .

Пожалуйста, помогите. :(

ТИА

UPDATE: Вы, ребята, удивительный!.. DI получил это работает в настоящее время благодаря вам, ребята Существовали несколько ошибок/перепутались, как я изучаю новые рамки Так вот что я

1) Я не задал делегат UITextField правильно. Ошибка: я скопировал текстовое поле в xcode и связал свой viewController как делегат и подумал, что это должно получиться. Мне все еще нужно исследовать и лучше понять, почему. Решение: я удалил ссылку ctrl-drag и явно вызвал myTextField.delegate = self в tableView: cellForRowAtIndexPath. И это все. Спасибо @Sidewalker

2) Ошибка: у меня смешанный текстFieldShouldBeginEditing и т. Д. И @IBAction func EditingDidBegin. Поэтому я попал в ситуацию, когда textFieldShouldBeginEditing получил звонок, но EditingDidBegin не получил вызов. Решение: как только я установил делегат = я явно и придерживаюсь реализации методов textField ... и не использую @IBAction для textField, все просто работает.

ответ

0

Вот один из вариантов ...Мы собираемся добавить логический флаг, чтобы определить, действительно ли вы нас в TextField, когда попытка редактирования другого TextField начинается

Сделайте свой класс прилипают к UITextFieldDelegate

class MyClass: UIViewController, UITextFieldDelegate 

Не забудьте установить делегат, мы добавим флаг, а

myTextField.delegate = self 
var inField = false 

Реализовать "textFieldShouldBeginEditing" и "textFieldDidBeginEditing"

func textFieldShouldBeginEditing(textField: UITextField) -> Bool { 
    if inField { 
     inField = false 
     return false 
    } 
    return true 
} 

func textFieldDidBeginEditing(textField: UITextField) { 
    inField = true 
} 

Я предпочитаю отслеживать такие вещи, а не идентифицировать подпункты, поскольку он позволяет использовать флаг в другом месте и сокращает сложность кода.

+0

Hi Sidetalker, Большое спасибо за ваш ответ.Быстрые вопросы: (но связанные с этим) 1) Я изначально не назначил делегат, я только реализую протокол UITextFieldDelegate. Мои методы, такие как textFieldDidBeginEditing, вызывались без установки делегата, поскольку вы явно показываете мне в своем примере (myTextField.delegate = self). Это то же самое, что использовать интерфейс Xcode для подключения с помощью ctrl-drag и выбрать мой UIViewController в качестве делегата для UITextField в каждом из UITableViewCell? – wotzup

+0

2) вопрос с другой стороны: теперь я устанавливаю myTextField.delegate = self в свой tableView: cellForRowAtIndexPath. Я не вижу различий в поведении приложения. 3) Я очень смущен, почему мой текстFieldShouldBeginEditing вызывается для элемента B, но мой textFieldDidBeginEditing делает ** не ** вызывается. (пример контекста: у моего приложения todo есть текущие 3 элемента: A, B, C. Я нажимаю на элемент A и получаю вызовы textFieldShouldBeginEditing и textFieldDidBeginEditing для элемента A. тогда я нажимаю элемент B, я получаю вызов только для textFieldSholdBeginEditing, но не textFieldDidBeginEditing для элемента А. Не могли бы вы помочь мне разобраться? TIA – wotzup

+0

1) Да, те делают то же самое – Sidetalker

0

Ну, клавиатура не уходит, потому что она не ожидает. Новый UITextField просто становится первым ответчиком, а другой уходит в отставку. Если вы не хотите, чтобы textField стал первым ответчиком, если другой уже есть, вам придется отключить его, прежде чем он получит шанс. Я бы попытался реализовать textFieldShouldBeginEditing и выяснить там логику.

Я не влюблен в то, как это выглядит, но это должно делать что-то в этом направлении.

func textFieldShouldBeginEditing(textField: UITextField) -> Bool { 
    for subView in self.view.subviews{ 
     if(subView.isKindOfClass(UITextField)){ 
      if(subView.isFirstResponder()){ 
       subView.resignFirstResponder(); 
       return false; 
      } 
     } 
    } 
    return true; 
} 
+0

Hi user3117251, Большое спасибо за ваш ответ и образец решения. Я попытался и все еще не сработал :(Однако, это дало мне неплохую попытку реализовать textFieldShouldBeginEditing, чтобы еще больше разобраться в деталях. Так что спасибо! Я пробовал ваш код и что если условие (subView.isFirstResponder() никогда не удовлетворяется – wotzup

+0

Интересно узнать меня: (контекст: todo app имеет 3 образца todo item A, B, C) 1) Когда я впервые запустил приложение и коснулся элемента A - UITextField. to textFieldShouldBeginEditing AND textFieldDidBeginEditing. ** HOWEVER **, после этого я нажимаю на элемент B, я получил только вызовы textFieldShouldBeginEditing элемента B, textFieldDidEditingEnd элемента A (в этом точном порядке), но ** никогда ** не получил вызов textFieldDidEditingBegin из пункта B – wotzup

+0

А, это имеет смысл, если didEndEditing вызывается первым. Попробуйте удалить sender.resignFirstResponder() из вашего didEnd Метод редактирования. Пока это называется первым, вы правы, что условие никогда не будет правдой. У меня это есть и я работаю над примером приложения, которое я сделал, если что-то еще не происходит, это должно гипотетически работать. – Dare

0

Сначала задайте все UITextField (ваши создания) делегата как self и создайте одну переменную-член UITextField. Теперь реализуем метод делегата textFieldDidBeginEditing и присваиваем текстовое поле переменной вашего члена UITextField. Как приведено ниже

func textFieldDidBeginEditing(textField: UITextField) { 
    yourMemberVariable = textField; 
} 

Итак, теперь, когда вы хотите, чтобы закрыть клавиатуру вызвать метод распускать на «yourMemberVariable» объекта. Он должен работать !!

0

Что я обычно реализует это два метода:

Первый добавить UITapGestureRecognizer всему зрения UIViewController

func hideKeyboard() { 
    let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(dismissKeyboard)) 
    view.addGestureRecognizer(tap) 
} 

Второй раз дозвонились каждый раз, когда прикосновение пользователя в любом месте на вид UIViewController в

func dismissKeyboard() { 
    self.view.resignFirstResponder() 
} 

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

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