我们应该将tapGesture组件设为IBAction还是IBOutlet来捕获tap事件吗?

时间:2019-06-23 12:15:11

标签: ios swift

当我想在ViewController的主视图上点击响应时

A。我可以如下创建一个IBOutlet

class ViewController: UIViewController {

  @IBOutlet var tapGesture: UITapGestureRecognizer!
  override func viewDidLoad() {
    super.viewDidLoad()
    tapGesture.addTarget(self, action: #selector(tapped))
  }

  @objc private func tapped(_: UITapGestureRecognizer) {
    print("Log is here")
  }
}

B。我可以在TapGesture上使用IBAction,如下所示

class ViewController: UIViewController {

  @IBAction func tapGestureAction(_ sender: Any) {
    print("Log is here")
  }
  override func viewDidLoad() {
    super.viewDidLoad()
  }
}

有没有一种比另一种更好的方法?如果没有,应该在哪种情况下使用A方法,而应该使用B方法?

2 个答案:

答案 0 :(得分:2)

如果您已经在情节提要中创建了@IBAction,则最好选择选项B,即仅使用UITapGestureRecognizer插座,因为这样可以在情节提要中封装尽可能多的逻辑,从而减少阅读的开销在重构代码时(如果情节提要保持不变),不需要的代码和可能的回归。

您仍然可以将@IBAction标记为私有(因为它实际上与使用@objc属性相同)。另外,如果您需要访问手势识别器本身,则可以使用常规@IBOutletdidSet来对其进行修改,或者将sender: Any更改为sender: UITapGestureRecognizer以对其进行访问。动作。

答案 1 :(得分:2)

这是一个有趣的问题,从我的角度来看,这取决于您的应用程序在情节提要中的多少,或者您希望将其显式地编写在代码中。 我的建议是,如果您正在做一些小事情,那么应该快速使用故事板。但是,如果您的团队中有一个大型项目,那么将其包含在代码中会更好。

成为这些方法关键因素的另一件事是谁是参考的所有者,您是否希望手势进行一些交互。例如,我有一个手势应在特定情况下启用,而在其他情况下则应禁用。为此,您需要在代码中有一个参考。

我要解释的是,您应该考虑一些标准,例如如何以及何时可以使用此手势。并以此为基础来确定您是否需要较少的代码或引用手势,或者您需要什么