【问题标题】:Call UIButton AddTarget in the same class在同一个类中调用 UIButton AddTarget
【发布时间】:2018-06-02 04:25:31
【问题描述】:

我有一个简单的视图 V 和视图控制器 C。控制器调用一个单独的类 X,它构建一个 webview 和一个用于关闭 webview 的按钮。

我实例化类 X(引用视图 V)然后调用一个方法来附加两个项目(webview 和项目)。

当我调用按钮 addTarget 方法时,它不起作用。我希望它执行 X 类的 closeAll 方法,而不是 C 控制器的 closeAll 方法。

我已经尝试了数百种变体。

这是 C 控制器中的(部分)代码:

let parentView:UIView
...

@objc func closeAll() {
    print("Close webview, object")
}

这在 X 类中:

    ...
    let transparentButton = UIButton(frame: frame)
    transparentButton.backgroundColor = UIColor.black.withAlphaComponent(self.overlayTransparency)
    transparentButton.setTitle("", for: .normal)
    transparentButton.alpha = 0.5
    transparentButton.isUserInteractionEnabled = true
    transparentButton.addTarget(self, action:#selector("closeAll"), for: .touchUpInside)
    parentView.addSubview(transparentButton)

我的 C 控制器中有这个,它在点击时被调用:

@objc func closeAll() {
    print("Close webview, main")
}

【问题讨论】:

  • 不清楚上面的代码在哪里运行,但是您需要将X 的实例作为目标传递并且您的选择器语法不正确(它不是字符串):transparentButton.addTarget(instanceOfX, action:#selector(X.closeAll), for: .touchUpInside)
  • 感谢您的回答。我尝试了 transparentButton.addTarget(self, action:#selector(X.closeAll), for: .touchUpInside) 没有成功。 C.closeAll 仍在被调用。
  • 您是否将 X 的实例分配给 C 的属性?
  • 不,我没有。实际上 X 是一个小框架的一部分,我希望类的实现和使用尽可能简单。

标签: ios swift uiview uibutton addtarget


【解决方案1】:

将 self 更改为您希望触发其方法的类的实例

【讨论】:

  • 没有。在运行时,它会尝试在主控制器中找到 closeAll 方法。
【解决方案2】:

您可以将其中任何一个插入到您的课程中:

override func viewDidLoad() {  
    super.viewDidLoad()
    transparentButton.addTarget(self, action:#selector(closeAll),  for: .UIControlEvents.valueChanged)
}

func closeAll(sender:AnyObject) {
    // your code
}

@IBOutlet var btnStartJob: UIButton!
override func viewDidLoad()    {  
    super.viewDidLoad()
    btnStartJob.addTarget(self, action: #selector(closeAll), for: .touchUpInside)
}

func closeAll(_ sender : UIButton) {
    // your code
}

【讨论】:

  • 好的,我会测试一下,但我的 X 类不是 UIView。将不得不重构一点。谢谢你的回答。
  • 它没有用。 id 所做的是将 UIButton 子类化,然后我将 closeAll 放在该类中。
  • 你能解释清楚吗?否则把你的代码我可以检查它。我会给你正确的答案
猜你喜欢
  • 2012-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多