许多 UIButtons 的共享操作,获取特定于按钮的字符串
Posted
技术标签:
【中文标题】许多 UIButtons 的共享操作,获取特定于按钮的字符串【英文标题】:Shared action for many UIButtons, get button-specific string 【发布时间】:2010-12-02 11:29:19 【问题描述】:我有一个包含许多 UIButtons “Tom and Jerry”、“The Lion King”等的视图。我希望它们都在我的视图控制器中调用相同的操作,然后区分不同的按钮来获取特定于按钮的 NSString(例如,“TomJerry”、“LionKing”等标识符)。
想法:
-
滥用按钮的标题文本属性(自定义按钮样式,清晰的文本颜色)。
可以使用,但感觉很脏……(仅当按钮不需要显示文本时才可以使用。)
子类 UIButton 带有额外的 ivar + 属性“上下文”。
非常适合以编程方式添加按钮,
但是: 我的视图是从 Nib 加载的,所以我必须为每个按钮定义一个插座(并在 awakeFromNib 或 viewDidLoad 中设置其上下文属性)。呜呜……
使用不同的“-(NSString*)context”方法实现为每个按钮创建一个子类。
呃……是认真的吗? ;-)
使用标签 来识别按钮和用于将标签映射到按钮特定字符串的字典。
DRY 违规:标签需要知道/指定两次——在 Nib 中识别按钮,在字典中检索相应的字符串。
到目前为止,我一直避免使用标签。也许这是一个开始的好机会?
如何最好地实现这一目标?有什么想法、最佳实践、实施模式?
更新:在阅读了第一个答案(谢谢!)之后,我相信我应该补充一些要点来澄清。
以上所有方法都应该工作;重点是,我并不特别喜欢其中任何一个。我在问你你会喜欢哪种方法(以及为什么),或者是否有其他更好的方法。
进一步的“要求”:
我不想将每个按钮都连接为插座。 我想以通用方式检索特定于按钮的字符串,即不打开动作发送器 à laif (sender==self.button1) … else if (sender==self.button2) …
【问题讨论】:
我为我的答案添加了一个替代解决方案。仍然基于标签,但更漂亮,不太容易出问题。 【参考方案1】:已添加 一个选项是创建一个 UIButton 类别,添加一个基于标签返回 NSString 的方法。您仍然遇到潜在的标签问题,但标签到字符串的转换——实际的和概念的——都在一个地方。
我相信这符合您最初的和进一步的要求。
以前 标签快速而轻便,比较两个整数。
您可以轻松创建一个编号方案,让事物清晰地分开:1000-1999 是这类事物,1000-1099 是这个子组,1015 是一个实例,等等。
数字比较可用:x.tag > 10000 这样做。
不过,很明显,这意味着您必须对其进行跟踪,并且您的代码最终可能难以解析。尽管如此,还是有一些不错的优势。
【讨论】:
有趣的想法。在迄今为止提出的所有方法中,它肯定是最好的!【参考方案2】:您可以在按钮处理程序中比较按钮引用。
IBOutlet UIButton *button1; IBOutlet UIButton *button2; -(IBAction)myButtonHanlder:(id)sender 如果(发件人==按钮1) //为button1做任务 else if (sender == button2) //为button2做任务注意:我还没有编译代码。但我想你已经明白了。
我对您的想法的评论是:
更改标题文本、颜色等是很自然的事情。按钮工作流程不应过多依赖视图样式。
仅为此比较子类化 UIButton 工作量太大。
这是比 2 更脏的版本。
好吧,你需要非常小心,你没有为两个不同的按钮使用相同的标签。
【讨论】:
感谢您的意见。请注意,根据我的想法#1,我建议将按钮特定的字符串简单地放在标题文本中(然后使文本不可见,因为在我的情况下,按钮仅用作 UIImageView 背景上方的可点击控件)。您对 #4 的评论正是使我远离标签方法的考虑因素之一。 如果是这样,那么使用 1 就更脏了。【参考方案3】:对于这种情况,最好的方法是创建一个 UIButton 类的子类,并添加一个属性,如 index 或任何其他对您有用的属性。
或者:在创建按钮时,为它们分配一些标签,根据标签你可以区分它们,你可以执行任何你想要的操作。
【讨论】:
以上是关于许多 UIButtons 的共享操作,获取特定于按钮的字符串的主要内容,如果未能解决你的问题,请参考以下文章
如何检查用户是不是在共享频道中写消息并告诉他或她在特定于机器人的频道中写
两个单独的 UIButtons 共享相同的按下...不能同时按下两个
sql 通过xxml共享类型查找特定于crm的帐户(DS,eLead,Vin,Reynolds&Reynolds / ReyRey等)