Ios 获取属性的名称而不是值

Ios 获取属性的名称而不是值,ios,core-data,Ios,Core Data,我正在使用核心数据,并一直在使用如下代码: [self.form setValue:self.comments.text forKey:@"comments"]; unsigned int propCount = 0; objc_property_t *properties = class_copyPropertyList([self class], &propCount); for(int idx = 0; idx < propCount; idx++) { objc

我正在使用核心数据,并一直在使用如下代码:

[self.form setValue:self.comments.text forKey:@"comments"];
unsigned int propCount = 0;
objc_property_t *properties = class_copyPropertyList([self class], &propCount);

for(int idx = 0; idx < propCount; idx++) {
    objc_property_t prop = *(properties + idx);
    NSString *key = @(property_getName(prop));
    NSLog(@"%@", key);
}
我想把这样的代码放到一个循环中,我所有的coredata名称都与属性名称相同。我怎样才能说出
forKey:self.comments.name
并得到与上面相同的结果或类似的结果

编辑:


如果这是不可能的,是否有另一种方法将大量值从属性设置到coredata中?我有50多个类似的属性和属性需要设置,并且希望避免使用我现在正在做的事情。

没有什么可以替代的,因为使用模式和语法在没有一点跑腿的情况下是不明显的

也就是说,您通常从数据存储中获取NSManagedObject子类的实例:

NSManagedObjectContext* moc = [delegate managedObjectContext];
NSEntityDescription* description = [NSEntityDescription entityForName:@"Filter" inManagedObjectContext:moc];
NSSortDescriptor* descriptor = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];
NSFetchRequest* request = [[NSFetchRequest alloc] init];
[request setEntity:description];
[request setSortDescriptors:[NSArray arrayWithObject:descriptor]];
NSError *error;
_enabledFilters = [NSMutableArray arrayWithArray:[moc executeFetchRequest:request error:&error]];
if (error) {
    NSLog(@"%@",error.localizedDescription);
}
在本例中,我现在有一个名为“Filter”的NSManagedObject实例数组

然后,您可以选择要引用的适当实例,并使用简单的点语法访问它的所有属性

Filter* thisFilter = (Filter*)[_displayFilters objectAtIndex:indexPath.row];
cell.label.text = thisFilter.name;
cell.label.backgroundColor = [UIColor clearColor];
NSString*targetName = thisFilter.imageName;
UIImage *image = [UIImage imageNamed:targetName];
cell.image.image = image;
现在我从我的持久数据存储中获取信息,并在我的应用程序中使用它

换一种方式写入数据存储中的实例只是略有不同,因为您直接设置NSManagedObject子类实例的属性,然后在上下文中调用
save
,将任何更改向下推送到存储中


TL;DR-您有义务花一两个小时处理CoreData文档…

如果您确实需要,可以从objc/runtime.h使用这些函数:

objc_property_t *class_copyPropertyList(Class cls, unsigned int *outCount) // To get properties declared by a class.
const char *property_getName(objc_property_t property) // To get the name of one property
大概是这样的:

[self.form setValue:self.comments.text forKey:@"comments"];
unsigned int propCount = 0;
objc_property_t *properties = class_copyPropertyList([self class], &propCount);

for(int idx = 0; idx < propCount; idx++) {
    objc_property_t prop = *(properties + idx);
    NSString *key = @(property_getName(prop));
    NSLog(@"%@", key);
}
unsigned int propCount=0;
objc_property_t*properties=class_copyPropertyList([self class],&propCount);
for(int-idx=0;idx
一种方法是自己声明一个属性数组

NSArray *attributes = [NSArray arrayWithObjects:..., @"comments", .., nil]; // or a NSSet
for(NSString *attribute in attributes){
    NSString *text = [[self performSelector:NSSelectorFromString(attribute)] text]; // presuming that it's safe to call 'text' on all your properties
    [self.form setValue:text forKey:attribute];
}

或者,如果您想要核心数据模型的所有属性,您也可以使用。

我可能错了,但我认为您在运行时无法获得什么是
self
,什么是
self.form
@property(强、非原子)ibuitextview*注释@财产(强,保留)NSManagedObject*表格我将对此进行一次尝试,这似乎是我正在寻找的。使用此代码,我可以不使用idx获得属性名称吗?因为您可以获得类中声明的属性列表,你必须索引才能访问它们。这与我需要的非常接近,但我不想使用索引,因为我有其他属性,这可能会把事情搞砸。我想从self.comments中获取属性名称,这样当我给它self.comments时,它就会记录/打印“comments”