このメソッドを持つシングルトン データ マネージャーがあります。
-(NSArray*)fetchItems
{
NSEntityDescription *entity = [NSEntityDescription
entityForName:@"Item" inManagedObjectContext:self.managedObjectContext];
NSError *error2;
NSFetchRequest *itemFetchRequest = [[NSFetchRequest alloc] init];
[itemFetchRequest setEntity:entity];
[itemFetchRequest setReturnsObjectsAsFaults:NO];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"order"
ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[itemFetchRequest setSortDescriptors:sortDescriptors];
NSArray *fetchedItems = [self.managedObjectContext executeFetchRequest:itemFetchRequest error:&error2];
return fetchedItems;
}
次に、次のようなコア データ オブジェクトに基づいていくつかのビューを作成します。
self.items = [dataManager fetchItems];
for (Item *item in self.items) { //Item is the NSManagedObject subclass
ItemView *itemView = [[ItemView alloc] initWithFrame:aFrame ];
[itemView layoutWithData:item];
[self.someView addSubview:itemView];
}
ItemView のデータは次のように設定されます。
- (void)layoutWithData:(Item*)_data {
self.data = _data;
NSLog(@"ItemView data: %@", self.data); //not "fault" at this point
...
UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
[btn setImage:data.image forState:UIControlStateNormal];
[btn addTarget:self action:@selector(tapDetected:) forControlEvents:UIControlEventTouchUpInside];
btn.frame = aFrame;
[self addSubview:btn];
}
この時点で、ItemView のデータは定義されており、「障害」ではありません。ただし、次のようにタップが検出された場合:
- (void)tapDetected:(id)sender
{
NSLog(@"TAP: %@", self.data); //fault - see below
[self.delegate itemTapped:self.data];
}
私はこのようなものを得る:
TAP: <Item: 0x879ce40> (entity: Item; id: 0x8798310 <x-coredata://8BE9ABFE-7C63-4ADD-9AD1-62B81C5AFF66/Item/p66> ; data: <fault>)
ItemView をタップすると、データが最初は「非フォールト」で、後で「フォールト」になるのはなぜですか?どうすれば修正できますか? これは一日中私を殺してきました...
編集: このコードを使用して、データが layoutWithData メソッドの障害ではなく、tapDetected メソッドの障害であることを確認できます。
NSLog(@"is fault? %i", self.data.isFault);
なぜそれが障害になるのですか?