许多UIButton的共享操作,获取特定于按钮的字符串

时间:2010-12-02 11:29:20

标签: iphone design-patterns interface-builder nib iboutlet

我有一个视图,其中包含许多UIButtons“Tom and Jerry”,“狮子王”等等。我希望他们所有人都在我的视图控制器中调用相同的动作,然后区分不同的按钮以获得特定于按钮的NSString(例如“TomJerry”,“LionKing”等标识符)。

思路:

  1. 滥用按钮的标题文字属性(自定义按钮样式,明文文字颜色)。
    • 会工作,但感觉很脏......(只有在按钮不需要显示文字时才有效。)
  2. 子类UIButton ,带有额外的ivar +属性“context”。
    • 非常适合以编程方式添加按钮,
    • 但是:我的视图是从Nib加载的,所以我必须为每个按钮定义一个插座(并在awakeFromNib或viewDidLoad中设置其上下文属性)。的Bleh ...
  3. 使用不同的“ - (NSString *)context”方法实现为每个按钮创建子类。
    • 呃...认真的? ; - )
  4. 使用标记标识按钮和字典,以便将标记映射到特定于按钮的字符串。
    • DRY违规:标签需要知道/指定两次 - 在Nib中识别按钮,并在字典中检索相应的字符串。
    • 到目前为止,我避免使用标签。也许这将是一个很好的开始机会?
  5. 如何最好地实现这一目标?任何想法,最佳实践,实施模式?


    更新:在阅读完第一个答案后(谢谢!),我相信我应该补充一点来澄清。

    上述所有方法都应工作;重点是,我并不特别喜欢其中任何一个。我问你要采用哪种方法(以及为什么),或者是否有其他更好的方法。

    进一步的“要求”:

    • 我不想将每个按钮连接为插座。
    • 我想以通用方式检索特定于按钮的字符串,即没有切换动作发送者àlaif (sender==self.button1) {…} else if (sender==self.button2) {…}

3 个答案:

答案 0 :(得分:2)

<强>加
一个选项是创建一个UIButton类别,添加一个基于标记返回NSString的方法。你仍然有潜在的标签问题,但标签到字符串的转换 - 实际和概念 - 都在一个地方。

我相信这符合您的原始和进一步的要求。


<强>以前
标签快速而轻巧,比较两个整数。

您可以轻松创建一个编号方案,使事物保持清晰分离:1000-1999是这种类型的东西,1000-1099是这个子组,1015是一个实例,等等。

可以使用数字比较:x.tag&gt; 10000这样做。

显然,这意味着你必须跟踪它,你的代码最终可能难以解析。仍然有一些很好的优点。

答案 1 :(得分:0)

您可以比较按钮处理程序中的按钮引用。

IBOutlet UIButton *button1;
IBOutlet UIButton *button2;

-(IBAction)myButtonHanlder:(id)sender {
    if (sender == button1) {
        // do task for button1
    } else if (sender == button2) {
        // do task for button2
    }
}

注意:我没有编译代码。但我想你已经有了这个主意。

我对您的想法的评论是:

  1. 更改标题文字,颜色等非常自然。按钮工作流程不应过多依赖于视图样式。

  2. 为这种比较对UIButton进行子类化太多了。

  3. 这是2的更脏的版本。

  4. 嗯,你需要非常小心,你没有为两个不同的按钮使用相同的标签。

答案 2 :(得分:0)

对于此上下文,最好的方法是创建UIButton类的子类,并添加一个属性,如index或任何其他对您有用的属性。

或者

创建按钮时为其指定一些标签, 根据标签,您可以区分它们,您可以执行任何您想要的操作。

此致

Satya