2012-06-06 3 views
1

Решенные - см нижеObjC получить имя свойства

Да. Я много искал без успеха.

Я искал способ получить имя свойства как StringValue изнутри метода.

Позволяет сказать:

Мой класс имеет X подвиды от типа UILabel.

@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" и скоро.

Благодарим за помощь!

Reagrds JOE

***** Обновление ***

Как и в ответе Graver описано решение: class_copyIvarList, которая возвращает имя Ивара.

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); 

See Сообщений: https://stackoverflow.com/a/2302808/1228534 и Objective C Introspection/Reflection

Большое спасибо вам, ребята!

+1

см этот пост: http://stackoverflow.com/a/2302808/1228534 – graver

+0

возможно дубликат [Objective C Самоанализ/Отражение] (http://stackoverflow.com/questions/2299841/objective-c-introspection-reflection) –

+0

Это именно то, что я ищу! class_copyIvarList выполнил эту работу! большое спасибо!!! –

ответ

0

непроверенный код из Getting an array of properties for an object in Objective-C

id currentClass = [self class]; 
NSString *propertyName; 
unsigned int outCount, i; 
objc_property_t *properties = class_copyPropertyList(currentClass, &outCount); 
for (i = 0; i < outCount; i++) { 
    objc_property_t property = properties[i]; 
    propertyName = [NSString stringWithCString:property_getName(property)]; 
    [email protected]("The propertyName is %@",propertyName); 
} 
+0

Tahnks для вашего ответа. Но этот блок возвращает все имена свойств данного представления. Например, UILabel: lineSpacing, текст, шрифт и т. Д. То, что я ищу, - это «имя переменной (свойства)» данной метки, как определено в файле заголовка. –

+0

class_copyIvarList – ader

+0

Если вы хотите, чтобы ivars использовали class_copyIvarList, если вы хотите, чтобы свойства использовали class_copyPropertyList, как указано выше, и если вы хотите, чтобы методы использовали class_copyMethodList. Я не уверен, что вы не понимаете. Я боюсь. Наверняка вы запустили бы это против своего подкласса, чтобы получить свойства, которые вы там определили? Похоже, вы используете это против класса UILabel, когда вы должны запускать его против вашего подкласса X. – ader

0

Легкого способа получить конкретное имя свойства без запуска цикла

Допустит, пользовательский объект, как показано ниже

@interface StoreLocation : NSObject 
@property (nonatomic, strong) NSString *city; 
@property (nonatomic, strong) NSNumber *lat; 
@property (nonatomic, strong) NSNumber *lon; 
@property (nonatomic, strong) NSString *street; 
@property (nonatomic, strong) NSString *state; 
@property (nonatomic, strong) NSString *code; 
@end 


@interface AppleStore : NSObject 

@property (nonatomic, strong) StoreLocation *storeLocation; 

@end 

Ниже Объективных макросы получит желаемый результат

#define propertyKeyPath(property) (@""#property) 
#define propertyKeyPathLastComponent(property) [[(@""#property)componentsSeparatedByString:@"."] lastObject] 

Используйте этот код, чтобы получить имя свойства

NSLog(@"%@", propertyKeyPath(appleStore.storeLocation)); //appleStore.storeLocation 
NSLog(@"%@", propertyKeyPath(appleStore.storeLocation.street)); //appleStore.storeLocation.street 
NSLog(@"%@", propertyKeyPathLastComponent(appleStore.storeLocation)); //storeLocation 
NSLog(@"%@", propertyKeyPathLastComponent(appleStore.storeLocation.street)); //street 

Источник: http://www.g8production.com/post/78429904103/get-property-name-as-string-without-using-the-runtime

+0

эта ссылка - это дерьмо. это просто выполнение строковых манипуляций. Если вы просто сделаете propertyKeyPath (buzz.lightyear), это сработает – SonicBison

+0

Это соответствует моей проблеме. Большое спасибо. – samthui7

Смежные вопросы