【问题标题】:UIButton with multiple target actions for same event具有针对同一事件的多个目标操作的 UIButton
【发布时间】:2019-10-08 04:38:42
【问题描述】:

我可以在 UIButton 上为同一个事件添加多个目标操作,如下所示?

[button addTarget:self action:@selector(xxx) forControlEvents:UIControlEventTouchUpInside];
[button addTarget:object action:@selector(yyy) forControlEvents:UIControlEventTouchUpInside];

我做了一个快速应用来测试它,它执行按钮按下的两个动作。

我想知道这样做是否是一种好习惯,并且执行顺序是否始终保持不变?

提前致谢。

编辑:我确实找到了这个post,它声明它是以相反的添加顺序调用的,即首先调用最近添加的目标。但尚未确认

【问题讨论】:

  • 这是否是“一个好的做法”在很大程度上取决于意见。该文档没有对订单提出任何要求,因此我不会指望订单。事实上,我会假设执行顺序是随机的。
  • 如果顺序很重要,请使用单个操作处理程序,并在该处理程序中按所需顺序执行任务。
  • @bsod 这是一个很好的解决方案,我已经想到了,但是我如何将目标(self 除外)和选择器传递给操作处理程序?

标签: ios objective-c uibutton


【解决方案1】:

是的,可以向一个按钮添加多个操作。

就我个人而言,我更希望委托人订阅该按钮。 让您想要添加为targetobject 订阅委托的方法,以便在您按下按钮时它可以接收事件。

将事件转发给其他方法以完全控制的单个操作

一个简单的快速测试

import UIKit

class ViewController: UIViewController {

  override func viewDidLoad() {
      super.viewDidLoad()
      // Do any additional setup after loading the view.

      let button = UIButton(frame: CGRect(x: 50, y: 50, width: 300, height: 30))
      button.backgroundColor = .orange
      button.addTarget(self, action: #selector(action1), for: .touchUpInside)
      button.addTarget(self, action: #selector(action2), for: .touchUpInside)
      button.addTarget(self, action: #selector(actionHandler), for: .touchUpInside)
      self.view.addSubview(button)
  }

  @objc func actionHandler(_ sender: UIButton){
      print("actionHandler")
      action1(sender)
      action2(sender)
  }

  @objc func action1(_ sender: UIButton) {
      print("action1")
  }

  @objc func action2(_ sender: UIButton) {
      print("action2 \n")
  }
}

一键输出:

action1
action2 

actionHandler
action1
action2 

正常添加动作时能否确认执行顺序

是的,它按照您设置目标的顺序执行。

【讨论】:

  • 感谢您的回答。我可以为同一个事件的按钮添加多个操作。我更倾向于了解调用的顺序以及这是否是一种好的做法。
  • 您绝对应该考虑使用委托。我已经更新了答案
  • 感谢更新。正常添加action的时候能确认一下执行顺序吗?
  • 是的,它按照您设置目标的顺序执行。再次更新答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-15
  • 1970-01-01
  • 1970-01-01
  • 2013-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多