Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/95.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 扩展UIKit类的类属性(无法访问@implementation)_Objective C_Ios_Uikit - Fatal编程技术网

Objective c 扩展UIKit类的类属性(无法访问@implementation)

Objective c 扩展UIKit类的类属性(无法访问@implementation),objective-c,ios,uikit,Objective C,Ios,Uikit,可能重复: 我正试图找到一种扩展UIButton的方法,这样它就可以拥有类似 @property(assign, nonatomic) id userInfos; 没有子类化它 这可能吗 在我的情况下,按钮.tag是不够的 好的,这里总是有更好的答案 您可以使用objective-c运行时的关联对象功能将一个对象与另一个对象关联: void objc_setAssociatedObject(id对象,void*键,id值,objc_AssociationPolicy策略) id objc_g

可能重复:

我正试图找到一种扩展UIButton的方法,这样它就可以拥有类似

@property(assign, nonatomic) id userInfos;
没有子类化它

这可能吗

在我的情况下,
按钮.tag
是不够的

好的,这里总是有更好的答案


您可以使用objective-c运行时的关联对象功能将一个对象与另一个对象关联:

void objc_setAssociatedObject(id对象,void*键,id值,objc_AssociationPolicy策略)

id objc_getAssociatedObject(id对象,void*键)

此外,投票结束。副本:

在许多其他方面

编辑:


我也同意@Paul.s对你问题的评论。将数据附加到按钮听起来很混乱。在不知道您在做什么的情况下,我建议您标记按钮,然后让您的视图控制器根据按钮的标记获取所需的任何数据。

使用Objective-C关联对象非常简单:

在标题中:

@interface UIButton (MyCustomProperty)
@property (readwrite, retain, nonatomic) id myCustomProperty;
@end
在您的实现文件中:

#include <objc/runtime.h>

/* Associated objects need a unique memory location to use as a key. */
static char MyCustomPropertyKey = 0;

@implementation UIButton (MyCustomProperty)
/* Use @dynamic to tell the compiler you're handling the accessors yourself. */
@dynamic myCustomProperty;

- (id)myCustomProperty {
    return objc_getAssociatedObject(self, &MyCustomPropertyKey);
}

- (void)setMyCustomProperty: (id)anObject {
    objc_setAssociatedObject(self, &MyCustomPropertyKey, anObject, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
@end
#包括
/*关联的对象需要一个唯一的内存位置来用作键*/
静态字符MyCustomPropertyKey=0;
@实现UIButton(MyCustomProperty)
/*使用@dynamic告诉编译器您自己正在处理访问器*/
@动态特性;
-(id)myCustomProperty{
返回objc_getAssociatedObject(self和MyCustomPropertyKey);
}
-(void)setMyCustomProperty:(id)一个对象{
objc_setAssociatedObject(self和MyCustomPropertyKey、anObject、objc_ASSOCIATION_RETAIN_NONATOMIC);
}
@结束

就这样

您想要的是创建一个UIButton。类别的设计是为了扩展现有类的功能。一旦创建了一个设置,您只需导入类别,就可以在为其设计的类的任何实例上使用它的功能。

出于兴趣,查看您实际添加的内容?我觉得这是一种代码味道,我同意保罗的观点。听起来这里没有遵循MVC分离。按钮不应该知道应用程序其余部分的情况。按钮只是通知视图控制器状态更改(按下、释放等)。拥有按钮的视图控制器应该处理这些事件并检索数据本身。正如人们在tableView中使用tag属性检索按钮的indexPath.row一样,我认为这是一种很好的方法,可以在选择器上获取我想要处理的对象,而不是在类中再次分叉它。尤其是在我的例子中,按钮是从核心数据nsset生成的。是的,这就是你要做的。通常,如果你有许多按钮调用相同的方法,你需要使用button.tag属性来知道哪个按钮调用了选择器,并从标记中找到你想要使用的对象,但我认为如果你可以通过button并在方法中直接使用button.myObject。我正在尝试您的答案,请稍后回复。它起作用了!然而,我更喜欢OBJC_ASSOCIATION_ASSIGN my按钮必须能够沿着其选择器传递对象。:)Awesome
OBJC\u ASSOCIATION\u ASSIGN
将只使用弱引用。如果没有对对象的其他引用,它将被释放,您将得到一个悬空的指针,还有一些不好的事情™ 会发生的。除非您有特定的理由使用
OBJC\u关联\u分配
,否则请使用
OBJC\u关联\u保留\u非原子