在winforms / C#中,大多数UI控件都有.Tag标记,所以像myButton.Tag = myObject;其中Tag属性是一个'对象'类型,因此您基本上可以存储任何类型的对象。我如何在Objective-C / Cocoa中实现这一目标?所有UI元素都有类似.Tag的东西,我可以存储NSObject或其他东西吗?如果是这样,请你提供一个例子。非常感谢!
注意:我确实在那里看到了整数.Tag,但我想要一个对象标签。但我想这不存在。好吧。
答案 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)
答案 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"]);
话虽如此,针对用户界面元素存储对象违反了模型 - 视图 - 控制器模式的原理;我建议反对它 - UIView
或UIControl
子类可能更适合。
答案 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/