2

我有一个包含许多 UIButtons “Tom and Jerry”、“The Lion King”等的视图。我希望​​它们都在我的视图控制器中调用相同的操作,然后区分不同的按钮以获得一个按钮-特定的 NSString(例如“TomJerry”、“LionKing”等标识符)。

想法:

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

如何最好地实现这一目标?任何想法、最佳实践、实施模式?


更新:在阅读了第一个答案(谢谢!)之后,我相信我应该添加一些要点来澄清。

以上所有方法都应该有效;关键是,我并不特别喜欢其中任何一个。我在问你你会喜欢哪种方法(以及为什么),或者是否有其他更好的方法。

进一步的“要求”:

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

3 回答 3

2

添加
了一个选项是创建一个 UIButton 类别,添加一个基于标签返回 NSString 的方法。您仍然遇到潜在的标签问题,但标签到字符串的转换——实际的和概​​念的——都在一个地方。

我相信这符合您最初的和进一步的要求。


以前
标签是快速和轻便的,比较两个整数。

您可以轻松地创建一个编号方案,使事物清晰地分开:1000-1999 是这类事物,1000-1099 是这个子组,1015 是一个实例,等等。

可以进行数字比较: x.tag > 10000 这样做。

但是,显然,这意味着您必须对其进行跟踪,并且您的代码最终可能难以解析。尽管如此,还是有一些不错的优势。

于 2010-12-02T12:34:16.093 回答
0

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

IBOutlet UIButton *button1;
IBOutlet UIButton *button2;

-(IBAction)myButtonHanlder:(id)sender {
    如果(发件人==按钮1){
        //为button1做任务
    } else if (sender == button2) {
        //为button2做任务
    }
}

注意:我还没有编译代码。但我想你已经明白了。

我对您的想法的评论是:

  1. 更改标题文本、颜色等是很自然的。按钮工作流程不应该过多地依赖于视图样式。

  2. 为这个比较子类化 UIButton 的工作量太大了。

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

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

于 2010-12-02T11:42:34.973 回答
0

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

或者:在创建按钮时为它们分配一些标签,根据标签你可以区分它们,你可以执行任何你想要的操作。

于 2010-12-02T12:50:42.320 回答