我可以在Objective-C中的按钮内存储自定义对象吗?

时间:2010-01-31 21:47:20

标签: iphone objective-c cocoa cocoa-touch uikit

在winforms / C#中,大多数UI控件都有.Tag标记,所以像myButton.Tag = myObject;其中Tag属性是一个'对象'类型,因此您基本上可以存储任何类型的对象。我如何在Objective-C / Cocoa中实现这一目标?所有UI元素都有类似.Tag的东西,我可以存储NSObject或其他东西吗?如果是这样,请你提供一个例子。非常感谢!

注意:我确实在那里看到了整数.Tag,但我想要一个对象标签。但我想这不存在。好吧。

5 个答案:

答案 0 :(得分:5)

正如Georg所说,你可以使用Objective-C运行时将任何对象与另一个对象相关联,因此如果你真的想要,可以将一个Object与一个控件相关联。

但这并不是标准Cocoa程序的工作原理。相反,在Cocoa中,模型 - 视图 - 控制器模式和委托是标准惯用法,并且不鼓励将对象直接关联到窗口小部件或视图。即使对于一个非常小的程序,你至少会创建一个模型控制器(通常称为Cocoa术语中的应用程序委托)来管理数据,并保持视图由标准控件组成。 。然后视图和模型控制器通过目标/动作和委托进行交互。

Apple对Cocoa中普遍存在的设计模式进行了非常好的讨论,请参阅here

通常,当您从一个API(Winforms / C#)移动到另一个API(Cocoa / Objective-C)时,存在一些相似之处,但也存在一些差异。通常值得学习如何在该API中完成任务,而不是试图将您习惯的内容用于新的情况。 (为了清楚起见,我不是说哪种API本来就更好;这种讨论是双向的!)

所以,当你遇到这种情况时:

要在API X中执行A,我知道成语P有效。我现在想要在API X中执行B。如何在API P中直接实现成语B

我建议你问一下

要在API X中执行B,我该怎么办? API B中的成语是什么?

代替。

答案 1 :(得分:2)

NSControl确实有tag和相关的setTag:方法。它不在内部使用,因此您可以在其中存储您喜欢的任何内容 - 它只存储NSInteger值。

所有Cocoa控件都从NSControl继承。

答案 2 :(得分:1)

有可能添加标签,如果我没记错的话,这是一个整数。

这就是说,我很确定在Cocoa中永远不需要这个功能,因为它不会以这种方式工作。

如果您真的想要添加信息,可能会对运行时的能力to associate an object with another object感兴趣。

答案 3 :(得分:1)

CALayer能够将任意密钥存储为其键值编码机制的一部分。例如:

CALayer *myLayer = [button layer];
// Storing a value
[layer setValue:@"World!" forKey:@"hello"];
// Retrieving a value
NSLog(@"Hello %@", [layer valueForKey:@"hello"]);

话虽如此,针对用户界面元素存储对象违反了模型 - 视图 - 控制器模式的原理;我建议反对它 - UIViewUIControl子类可能更适合。

答案 4 :(得分:1)

是的。如果您愿意,可以将自己的属性添加到所有UIControl中。 只需将以下内容添加到您的代码中即可。

#import <objc/runtime.h>

/* -------- The Following Code adds an objectData property for every UIControl ----------- */
@interface UIControl (UIControlAdditions)
@property (nonatomic, retain) id objectData;
@end

static char const * const ObjectDataKey = "MyObjectDataKey";

@implementation UIControl (UIControlAdditions)
@dynamic objectData;
-(id)objectData {
    return objc_getAssociatedObject(self,ObjectDataKey);
}
- (void)setObjectData:(id)newObjectData {
    objc_setAssociatedObject(self, ObjectDataKey, newObjectData, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
@end
/* -------- The Above Code adds an objectData property for every UIControl ----------- */

Ole Begemann的致辞:http://oleb.net/blog/2011/05/faking-ivars-in-objc-categories-with-associative-references/