为什么没有调用textFieldShouldReturn函数?

时间:2015-05-22 21:51:12

标签: swift keyboard

根本没有调用textFieldShouldReturn函数:没有错误,但键盘根本没有响应。

我的情况与How to hide keyboard in swift on pressing return key?不同,因为在我的情况下根本没有发生任何事情,而其他情况则在Objective-C中。

这是我的代码:

import UIKit

class ViewController: UIViewController {

    @IBOutlet var textField: UITextField!

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

textField是我的故事板上文本字段的出口。我还尝试了self.endEditing而不是resignFirstResponder

5 个答案:

答案 0 :(得分:29)

这个答案的其余部分仍然非常有用,我会把它留在那里,因为它可以帮助其他的问题......但是在这里,我错过了这个具体例子的明显问题......

我们没有在文本字段上调用resignFirstResponder。我们在视图控制器上调用它。我们需要在文本字段中调用它,因此请将代码修改为如下所示:

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

UITextField只会调用作为其委托对象的textFieldShouldReturn属性。

我们可以通过添加viewDidLoad方法以编程方式修复此问题:

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

但我们也可以在构建时通过故事板进行设置。

右键单击文本字段以检查代理是否已设置:

enter image description here

如果delegate旁边的圈子未填充,我们尚未为UITextField设置委托。

要设置代理,请将鼠标悬停在此圈子上。它将变为加号。现在单击并拖动到要委派文本字段的视图控制器(文本字段所属的视图控制器)。

enter image description here

当您将视图控制器作为委托适当地挂钩时,此菜单应如下所示:

enter image description here

答案 1 :(得分:3)

如果使用Swift 3+,则必须在第一个属性之前添加下划线。喜欢:

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

这在Apple文档中也有很好的记录。 https://developer.apple.com/documentation/uikit/uitextfielddelegate/1619603-textfieldshouldreturn

答案 2 :(得分:2)

我注册了Swift 4 Udemy课程,除了Cntrl之外,讲师还说要为ViewController添加UITextFieldDelegate类 - 从textField拖动到ViewController按钮并选择委托。

导入UIKit

class ViewController: UIViewController, UITextFieldDelegate {

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

答案 3 :(得分:1)

嗯,就我而言。我不小心启用了硬件键盘。确保未选中“连接到硬件键盘”,以使键盘显示在模拟器中。

硬件->键盘->连接到硬件键盘

希望这对其他人也有帮助!

答案 4 :(得分:0)

您可以在循环中设置所有textFields委托:

class GeometricShape{

    Point ShapePoint;

public:

    GeometricShape(Point coord){
        ShapePoint = Point(coord);

    }

    virtual float getArea(){
        return 0;
    }

    virtual float getPerimeter(){
        return 0;
    }

    virtual void print(){
        ShapePoint.print();
    }

};