我正在寻找一种从方法内部获取属性名称作为 StringValue 的方法。
让我们说:
我的班级有来自 UILabel 类型的 X 子视图。
@property (strong, nonatomic) UILabel *firstLabel;
@property (strong, nonatomic) UILabel *secondLabel;
[...]
等等。
在方法 foo 中,视图迭代如下:
-(void) foo
{
for (UIView *view in self.subviews) {
if( [view isKindOfClass:[UILabel class]] ) {
/*
codeblock that gets the property name.
*/
}
}
}
结果应该是这样的:
THE propertyName(NSString) OF view(UILabel) IS "firstLabel"
我尝试了 class_getInstanceVariable、object_getIvar和property_getName ,但没有成功。
例如,以下代码:
[...]
property_getName((void*)&view)
[...]
回报:
<UILabel: 0x6b768c0; frame = (65 375; 219 21); text = 'Something'; clipsToBounds = YES; opaque = NO; autoresize = RM+BM; userInteractionEnabled = NO; layer = <CALayer: 0x6b76930>>
但我正在寻找这种结果:“ firstLabel ”、“ secondLabel ”等等。
解决了
正如在graver的回复中描述的那样,解决方案是:class_copyIvarList,它返回Ivar的名称。
Ivar* ivars = class_copyIvarList(clazz, &count);
NSMutableArray* ivarArray = [NSMutableArray arrayWithCapacity:count];
for (int i = 0; i < count ; i++)
{
const char* ivarName = ivar_getName(ivars[i]);
[ivarArray addObject:[NSString stringWithCString:ivarName encoding:NSUTF8StringEncoding]];
}
free(ivars);
请参阅帖子: https ://stackoverflow.com/a/2302808/1228534 和 Objective C Introspection/Reflection