如何在Swift中使回车键执行与按钮按下相同的操作?

83

我想知道如何允许通过点击软键盘上的回车键或点击UIButton来执行一个操作。

UI按钮已经设置好执行一个IBAction。

我该如何让用户也可以通过按下键盘上的回车键来执行相同的操作呢?

5个回答

122

确保您的类扩展了UITextFieldDelegate协议

SomeViewControllerClass : UIViewController, UITextFieldDelegate

您可以按照以下步骤执行操作:

override func viewDidLoad() {
    super.viewDidLoad()

    self.textField.delegate = self
}

func textFieldShouldReturn(textField: UITextField) -> Bool {

    //textField code

    textField.resignFirstResponder()  //if desired
    performAction()
    return true
}

func performAction() {   
    //action events
}

7
这个答案是正确的,但你的视图控制器必须采用UITextViewDelegate协议。 - lborgav
实际上,视图控制器需要采用UITextFieldDelegate协议,这样就可以正常工作了。 - Sergio Ayestarán
同意,我工作太久了,已经疲惫不堪。当我说“采用协议”时,我实际上是指@csga5000所说的,继承协议UITextFieldDelegate,例如:class myViewController: UIViewController, UITextFieldDelegate {},感谢您的纠正! - Sergio Ayestarán

96

更新

如果您的部署目标是iOS 9.0或更高版本,则可以将文本字段的“主要操作触发”事件连接到一个动作,如下所示:

connecting primary action triggered event

原始内容

使您的视图控制器采用UITextFieldDelegate协议。

将您的文本字段的代理设置为您的视图控制器。

实现textFieldShouldReturn:来调用您的操作。


13

Swift 4.2 :

对于通过编程创建且不需要委托的文本字段,还有其他方法:

     MyTextField.addTarget(self, action: #selector(MyTextFielAction)
                               , for: UIControl.Event.primaryActionTriggered)

然后按照以下方式执行您的操作:

    func MyTextFielAction(textField: UITextField) {
       //YOUR CODE can perform same action as your UIButton
    }

5
如果您的部署目标是iOS 9.0或更高版本,则可以将文本字段的“Primary Action Triggered”事件连接到操作,如下所示:
我无法按照建议使“Primary Action Triggered”起作用。 我使用了“Editing Did End”,现在可以使用 Editing Did End截图

enter image description here


2

这里是一个完整的例子,包括:

  1. 按钮动作:在按下按钮时,可以执行写入和清除标签以及文本的操作,当重复按下按钮时,它会交替执行这两个操作。

  2. 键盘返回:在按下键时触发操作,并取消第一响应者。

class ViewController: UIViewController, UITextFieldDelegate {
    
    @IBOutlet weak var textField1: UITextField!
    @IBOutlet weak var label1: UILabel!
    
    var buttonHasBeenPressed = false
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        textField1.delegate = self
    }
    
    
    @IBAction func buttonGo(_ sender: Any) {
        performAction()
    }
    
    
    
    
    
    
    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        performAction()
        return true
    }
    
   
    func performAction() {
        buttonHasBeenPressed = !buttonHasBeenPressed
        
        if buttonHasBeenPressed == true {
            label1.text = textField1.text
        } else {
            textField1.text = ""
            label1.text = ""
        }
        
    }
    
}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接