2017-03-06 96 views
0

我在我的VC中有两个textFields和一个Done按钮,但我在编辑结束时遇到了一些问题。Swift:无法让UITextField关闭键盘

当我在一个textField抽头的另一个,或当我点击文本框外内后(因为我添加了一个抽头识别器到父视图)我textFieldDidEndEditing方法被调用而不是当我点击Done按钮。

而且,最重要的(特别是当我在实际设备上运行时),即使我的textFieldDidEndEditing方法调用resignFirstResponder(),键盘在任何这些情况下都不会消失。

为什么键盘没有打开?另外,有没有办法让textFieldDidEndEditing在我自动打出场外时(而不是来自水龙头识别器)?这似乎应该是它的工作方式,但如果我错了,我错了。

下面是我的代码的一些相关部分。

1.尝试关闭键盘。该方法的第一部分工作,并存储值(当方法被调用时,就是这样)。光标不会从textField中消失,键盘也不会被解除。

 func textFieldDidEndEditing(_ textField: UITextField) { 
    if let playerName = textField.text, let playerNum = nameFields.index(of: textField) { 
     playerNames[playerNum] = playerName 
    } 
    resignFirstResponder() 
} 

func textFieldShouldReturn(_ textField: UITextField) -> Bool { 
    textFieldDidEndEditing(textField) 
    return true 
} 

而且,这里有一个奇怪的事情:当我在textFieldDidEndEditing和调试设置断点,在一个字段中输入一个值,然后按Done,它塞格斯到下一个场景,并然后停在textFieldDidEndEditing,这在这一点上没有效果(可以存储这些值,但它们不会反映在新场景中)。

2.尝试添加水龙头识别器到完成按钮。我的代码中没有完成按钮的出口,只是出于懒惰,所以这可能是最好的解决方案。但是,我仍然感兴趣,为什么这不起作用。这与定义在父视图中工作的轻敲识别器的代码相同。

func dismiss(_ sender:UITapGestureRecognizer) { 
    nameFields.forEach { textFieldDidEndEditing($0) } 
} 

override func viewDidAppear(_ animated: Bool) { 
    for view in view.subviews where view is UIButton { 
     let dismissTextField = UITapGestureRecognizer(target: self, action: #selector(dismiss(_:))) 
     dismissTextField.numberOfTapsRequired = 1 
     view.addGestureRecognizer(dismissTextField) 
    } 
} 

回答

3

你需要调用,而不是调用textFieldDidEndEditingresignFirstRespondertextFieldShouldReturn方法。

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

而且在TapGesture方法只需拨打endEditing(_:)view,而不是通过文本框的阵列循环。

func dismiss(_ sender:UITapGestureRecognizer) { 
    self.view.endEditing(true) 
} 
+0

噢,我的天啊,我好蠢。我在正确的地方称呼它,但是我没有把它叫到任何东西上。只需将'resignFirstResponder()'改为'textField.resignFirstResponder()'就可以解决所有问题。那么,在代码中为done按钮添加一个插座动作。谢谢! –

+0

@JonathanTuzman欢迎伴侣:) –