【问题标题】:Is it possible to override action method for UIButton in Swift?是否可以在 Swift 中覆盖 UIButton 的操作方法?
【发布时间】:2016-07-04 14:06:06
【问题描述】:

我有一个UIButton。我想使用相同的UIButton 来执行多个操作。首先,我以编程方式将操作设置为按钮。

button1.addTarget(self, action: #selector(ViewController.function1), forControlEvents: .TouchUpInside)

接下来,我想放弃该功能并想添加其他操作。

button1.addTarget(self, action: #selector(ViewController.function2), forControlEvents: .TouchUpInside)

是否可以覆盖按钮的现有目标?

【问题讨论】:

  • 对一个按钮使用多个 addTarget 是没有意义的,高级推理是:"button -> IBAction ,然后你在 action 方法中开发你的条件..
  • leftBarButton.target = nil 如果正在寻找 UIBarButtonItem

标签: ios swift uibutton


【解决方案1】:

您建议的情况不会覆盖上一个操作,而是将第二个操作添加到按钮,从而导致调用 ViewController.function1ViewController.function2

您需要先从目标中删除之前的操作,然后再使用添加新操作

button1.removeTarget(self, action: #selector(ViewController.function1), forControlEvents: .AllEvents)

或者在添加新的之前删除所有以前的操作

button1.removeTarget(nil, action: nil, forControlEvents: .AllEvents)

【讨论】:

    【解决方案2】:

    您需要先从目标中删除之前的操作,然后再添加新的操作,否则这两个操作都会触发

    button1.removeTarget(self, action: #selector(ViewController.function1), forControlEvents: .AllEvents)
    

    【讨论】:

      【解决方案3】:

      我建议您创建一个包装函数。因为动态添加/删除目标可能会导致死锁。

      所以你可能必须创建一个总是被调用的函数,然后在 :

      @IBOutlet func myWrapper(sender : AnyObject?) {
      
       if (conditionA) {
        // do stuff A 
       } else {
        // do stuff B
       }
      }
      

      【讨论】:

      • 能否提供您所说的死锁案例?
      • 这是最明智的答案,符合苹果框架。
      • 不,我不能,因为我不知道您的代码,我的意思是您可能处于删除所有目标或添加 2 个目标的状态。确实很难保障。拥有 if-else 语句是实现目标的更安全的方式(和可调试的方式)
      【解决方案4】:

      添加目标后,您可以使用按钮上的removeTarget 方法将其删除:

      func removeTarget(_ target: AnyObject?,
             action action: Selector,
       forControlEvents controlEvents: UIControlEvents)
      

      EDIT :请参阅@Rohit KP 的答案以了解用法示例。但是,您可能需要考虑使用其他“.AllEvents”,具体取决于您的需要。

      【讨论】:

        【解决方案5】:

        父代码:

        @IBAction open func valueChanged(_ sender: UIButton) {
            (do something)
        }
        

        子代码:

        override open func valueChanged(_ sender: UIButton) {
            super.valueChanged(sender)
            changeColorsOnState()
        }
        

        【讨论】:

          猜你喜欢
          • 2015-03-26
          • 1970-01-01
          • 2017-03-11
          • 2021-05-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-01-10
          相关资源
          最近更新 更多