2013-10-31 169 views
1

我使用的核心數據,並一直在使用這樣的代碼名稱:獲得屬性不是值

[self.form setValue:self.comments.text forKey:@"comments"]; 

我想提出這樣的代碼進入一個循環,我所有的coredata名稱是相同的作爲屬性名稱。我怎麼能說forKey:self.comments.name並得到與上述相同的結果或類似的東西?

編輯:

如果這是不可能的,有另一種方式設置一噸價值爲從性質coredata?我有50多個屬性和屬性需要設置,並且希望避免使用現在正在執行的操作。

+0

我可能是錯的,但我認爲你不能在運行時獲得 – KIDdAe

+0

什麼是self,什麼是self.form? –

+0

'@property(strong,nonatomic)IBOutlet UITextView * comments; @property(strong,retain)NSManagedObject * form;' – BluGeni

回答

3

如果你真的想要的話,你可以使用這些功能從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 

事情是這樣的:

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); 
} 
+0

我會給這個鏡頭,這似乎是我在找的東西。使用此代碼的 – BluGeni

+0

,我可以在不使用idx的情況下獲取屬性名稱嗎? – BluGeni

+0

由於U獲得了在類中聲明的屬性的列表,因此您必須進行索引才能訪問它們。 – imihaly

0

reading the docs on CoreData確實不能替代reading the docs on CoreData,因爲使用模式和語法不會顯而易見,而且不會帶來一點問題。

這就是說,你通常取從數據存儲的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); 
} 

在這個例子中,我現在有我的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文件...

0

一種方法是申報自己的屬性的數組。

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]; 
} 

或者你可以使用this如果你希望你的核心數據模型的所有屬性。