2016-03-31 4 views
0

Там это объяснение названия вопросаUITextField возврата ключа следующая ошибка

Вот часть кода InputViewController:

class InputViewController: UIViewController, UITextFieldDelegate { 
    private var firstResponderTag = 0 
    ... 
    func textFieldDidBeginEditing(textField: UITextField) { 
     firstResponderTag = textField.tag 
    } 

    func textFieldShouldReturn(textField: UITextField) -> Bool { 
     if let nextResponder = textField.superview?.viewWithTag(textField.tag + 1) { 
      nextResponder.becomeFirstResponder() 
     } else { 
      textField.resignFirstResponder() 
     } 
     return true 
    } 
    ... 
} 

И SigningInViewController:

class SigningInViewController: InputViewController { 
    ... 
    @IBOutlet 
    private weak var emailTextField: TextField! { 
     didSet { 
      emailTextField.validator = EmailValidator() 
     } 
    } 

    @IBOutlet 
    private weak var passwordTextField: TextField! { 
     didSet { 
      passwordTextField.validator = PasswordValidator() 
     } 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     Observable.combineLatest(emailTextField.rx_text, passwordTextField.rx_text, resultSelector: { 
      (email: String, password: String) in 
      email.length > 0 && password.length > 0 
     }).bindTo(signInButton.rx_enabled).addDisposableTo(bag) 
    } 
    ... 
} 

Проблема заключается в том, что, если нажать клавишу возврата Next, следующее текстовое поле становится первым ответчиком и немедленно отправляется в отставку. Но если я удаляю ключ возврата, он работает так, как должен. Итак, что я делаю неправильно?

UPD:

Я пропустил подобный вопрос в официальном репо RxSwift в. Решение

if let nextResponder = textField.superview?.viewWithTag(textField.tag + 1) { 
    dispatch_async(dispath_get_main_queue(), { 
     nextResponder.becomeFirstResponder() 
    }) 
} else { 
+0

ли вы найти решение? – mohamede1945

+1

@ mohamede1945, да, я нашел его. Вы можете видеть это в разделе UPD) –

ответ

0

Я не могу найти причину ошибки в коде, но я могу поделиться образец кода я просто написал недавно.

class NextTextField: UITextField, UITextFieldDelegate { 

    @IBOutlet weak var returnView: UIView? { 
     didSet { 
      if returnView is UITextField { 
       returnKeyType = UIReturnKeyType.Next 
      } 
     } 
    } 

    override func awakeFromNib() { 
     super.awakeFromNib() 

     delegate = self 
    } 

    func textFieldShouldReturn(textField: UITextField) -> Bool { 

     if let nextTextField = self.returnView as? UITextField { 
      nextTextField.becomeFirstResponder() 
     } else if let nextButton = self.returnView as? UIButton { 
      nextButton.sendActionsForControlEvents(.TouchUpInside) 
     } else { 
      self.resignFirstResponder() 
     } 

     return true 
    } 

} 

Он просто добавляет слабый returnView в textField, который можно легко установить с помощью кода или раскадровки. Когда нажата клавиша возврата текстового поля, она делает firstresponder returnView, если это другое текстовое поле, касается кнопки, если кнопка является returnView и скрывает клавиатуру, если нет returnView.

+0

К сожалению, этот код также работает с ошибкой, а также с моим. Но спасибо за хорошее решение с 'nextButton'. Я думаю, что это ошибка в RxSwift/RxCocoa –

0

В Свифта и RxSwift/RxCocoa 3.0.1

placeTextField.rx.controlEvent(UIControlEvents.editingDidEndOnExit)

работает отлично

вместо использования textFieldShouldReturn