【问题标题】:How to sort order of targets when using UIControl (specifically UIButton)?使用 UIControl(特别是 UIButton)时如何对目标进行排序?
【发布时间】:2012-01-12 00:39:34
【问题描述】:

在我的应用程序中,我有多个 UIButtons 为其添加目标。

事实证明,最近添加的目标首先执行,然后是其余目标。

以这段代码为例:

[button addTarget:self action:@selector(someAction:) forControlEvents:UIControlEventTouchUpInside];

[button addTarget:self action:@selector(someOtherAction:) forControlEvents:UIControlEventTouchUpInside];

如果我要在 button 内部进行修改,someOtherAction: 将在 someAction 之前调用。

这不是我想要的。我想对目标进行排序,以便我可以在该按钮内部进行修饰,首先调用someAction:ability,然后进行其他操作someOtherAction:

我不知道从哪里开始,我应该继承并覆盖UIButton 中的某些内容还是深入UIControl

感谢您的帮助!

-大卫

【问题讨论】:

    标签: objective-c ios uikit uibutton uicontrol


    【解决方案1】:

    最简单(尽管很老套)的方法是复制所有动作选择器,将它们从目标中删除,然后重新添加所有动作选择器,除了您希望首先发生的那个。

    但是,您的要求可能是一个糟糕的设计决策的副作用,因为这不是必要的行为。

    让某事先发生的最终目标是什么?

    为什么不能将这两种操作合二为一,以正确的顺序执行选择器?

    【讨论】:

    • 感谢本的想法。我这样做的原因很简单:我有一个 UIView 子类,我为其添加了按钮。我只想在视图中一次选择一个按钮。结果,当我创建按钮时,我添加了一个循环遍历所有按钮并“取消选择它们”的操作。我需要另一个选择器的原因是因为我的视图控制器添加了实际事件与我的子类。这是我遇到取消选择之前发生按钮操作的问题的地方。您对此有更好的设计想法吗?提前致谢!
    • 这两个动作不是发生得太快以至于看起来是同时发生的(添加按钮和取消选择)吗?
    • 您还可以保留对当前选定按钮的引用以避免循环,寻找选定的按钮。
    • 感谢您的想法。我不完全理解保持对选定按钮的引用将如何帮助(除了避免循环),因为我想将取消选择逻辑与视图控制器(设置实际操作)分开。动作也发生得不够快,因为发生的是视图控制器逻辑启动并选择按钮,并且按钮的 UI 发生变化。然后调用取消选择,UI 变回,到一天结束时,没有选择任何按钮。有任何想法吗?谢谢。
    【解决方案2】:

    您可以提供一个中间对象或代理对象,该对象始终接收按钮的操作,然后将适当的对象从它包含的数组转发到最终目的地。

    这样做的一种可能方法是覆盖代理对象的 -forwardInvocation: 和 -methodSignatureForSelector: 方法。见http://developer.apple.com/library/mac/#samplecode/ForwardInvocation/Introduction/Intro.html

    【讨论】:

      猜你喜欢
      • 2017-12-28
      • 1970-01-01
      • 2011-04-11
      • 2011-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多