这是我设置关联对象的方式:
objc_setAssociatedObject(navigationItem, "rightButton", leftButtonView, OBJC_ASSOCIATION_RETAIN);
这是我得到它的方式:
UIButton *favoriteButton = (UIButton *)objc_getAssociatedObject(self.navigationItem, "rightButton");
对象在两个实例中都是一个UIButton
,并且我在两个类中都有#import "objc/runtime.h"
。
事情是,它曾经有效,但现在由于某种原因它返回 null
。有什么想法吗?
编辑
我通过将 navigationItem
作为参数传递给另一个类来设置关联对象:
+ (void)setNavigationBarTitle:(NSString *)title
andLeftButton:(NSString *)leftButtonTitle
withSelector:(SEL)leftSelector
andRightButton:(NSString *)rightButtonTitle
withSelector:(SEL)rightSelector
andTarget:(id)target
forNavigationItem:(UINavigationItem *)navigationItem;
我在我的实用程序类中使用这个便捷方法为我的应用程序中的每个新 View Controller 设置一个导航栏。创建导航栏按钮时,我将它们与导航项相关联 - 我在问题中的第一行代码。
最佳答案
这是在黑暗中拍摄的,因为我无法重现该问题。问题可能是
objc_set/getAssociatedObject()
的 key
参数是一个唯一的指针。
所以如果两个不同的类使用字符串,你的代码将无法工作
“rightButton”
在不同的内存位置。字符串具有相同的内容,
但指针不同。
在任何情况下,您都应该确保相同的 key 用于设置和检索 关联对象:
在公共(public)头文件(或 .pch 文件)中放置一个
extern
声明:extern const void *rightButtonKey;
在一个 .m 文件中定义变量。 “自引用”保证指针具有唯一值:
const void *rightButtonKey = &rightButtonKey;
然后像这样使用它
objc_setAssociatedObject(navigationItem, rightButtonKey, leftButtonView, OBJC_ASSOCIATION_RETAIN);
关于ios - objc_getAssociatedObject 返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19933010/