【问题标题】:How to store auxiliary information inside a UIButton, via Interface Builder?如何通过 Interface Builder 在 UIButton 中存储辅助信息?
【发布时间】:2013-01-01 23:58:47
【问题描述】:

我正在构建一个自定义键盘,其中大约有 50 个 UIButton 键。我想为每个键添加一些分组信息,例如数字、字母、光标等。

首先想到的是tag 字段(100 表示字母,200 表示数字,......等等)

另一个选项是a category with Associative References

但是,这两种方法都不是非常Interface Builder 友好。还有其他选择吗?

【问题讨论】:

  • 我经常使用按钮title 属性来编码分组信息。如果您希望在按钮上显示标题,只需将按钮连接到IBOutletCollection,并循环访问每个标题以获取相关的显示和分组信息,并相应地解析字符串。

标签: ios objective-c cocoa-touch interface-builder


【解决方案1】:

你写的

我想为每个键添加一些分组信息,例如数字、字母、光标等。

为什么不使用IBOutletCollections?

您可以为“数字、字母、光标”中的每一个声明数组:

@property (nonatomic) IBOutletCollection(UIButton) NSArray *numberButtons;
@property (nonatomic) IBOutletCollection(UIButton) NSArray *letterButtons;
@property (nonatomic) IBOutletCollection(UIButton) NSArray *cursorButtons;

并轻松地将它们连接到界面构建器中:

【讨论】:

  • 确实,如果您想拥有一个管理按钮的第三方对象。但是,如果您希望按钮本身了解其类型/状态(顺便说一句,这是 OO 原则 -> 封装),这不是一个很好的解决方案。
  • @ValentinRadu 该按钮不在该抽象级别上运行。它关心图像、标题、目标和动作。无论是数字按钮,还是平方根按钮,或者你有什么,都是控制器层真正关心的问题,并且强制按钮负责将控制器逻辑移动到视图中。
  • @CarlVeazey 按钮的状态或种类不是“控制器逻辑”。但是这个问题从来都不是关于好的设计,所以让我们同意不同意。
【解决方案2】:

处理同一子类/类别中的所有内容的最简洁的方法可能是使用User Defined Runtime Attributes

对于上面的例子,你应该至少有一个方法:

-(void) setLocalizedKey:(NSString *) key;
//(NSString *) localizedKey; this is optional

或属性:

@property(nonatomic, strong) NSString * localizedKey;

如果您喜欢关联引用(或者您不需要存储或无权访问类本身),则在您的 UIButton 子类或类别中声明和实现(或 @synthesize)。

在上面的示例中,对于该特定实例,key 的值将是 HOW_IT_WORKS。这是我通常处理本地化的方式,但也应该符合您的目的。

【讨论】:

    【解决方案3】:

    也许我误解了你的问题,但 tag 属性绝对可以通过 XCode/Interface Builder 为 UIButtons 设置。

    【讨论】:

    • 这是我的错,我没有弄清楚 friendly 是什么意思。 tag 绝对可以在 IB 中设置,但它只是一个数字。我正在寻找一些直观的替代方案。比如color呢?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-21
    • 2017-06-20
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多