在数据模型中,我有临时属性uppercaseFirstLetterOfName
,它将返回持久属性的第一个字母。我在
NSSortDescriptor* sortByWordDescriptor = [[NSSortDescriptor alloc]
initWithKey:@"subject" ascending:YES];
NSArray* sortArray = [[NSArray alloc]
initWithObjects:sortByWordDescriptor, nil];
[fetchRequest setSortDescriptors:sortArray];
NSFetchedResultsController* controller = [[NSFetchedResultsController alloc]
initWithFetchRequest:fetchRequest
managedObjectContext:managedObjectContext
sectionNameKeyPath:@"uppercaseFirstLetterOfName"
cacheName:@"Root"];
当我更改从fetchedresultscontroller获取的持久对象以便删除该部分时,只会触发controller:didChangeObject
。但是由于该部分已经消失(事实上),我希望controller:didChangeSection
也被解雇。在修改持久对象以便调用controller:didChangeSection
时,我应该做些额外的事吗?
UPD:
这是模型子类
中的瞬态属性getter- (NSString *)uppercaseFirstLetterOfName
{
[self willAccessValueForKey:@"uppercaseFirstLetterOfName"];
NSString *aString = [[self valueForKey:@"subject"] uppercaseString];
NSString *stringToReturn = [aString substringWithRange:
[aString rangeOfComposedCharacterSequenceAtIndex:0]];
[self didAccessValueForKey:@"uppercaseFirstLetterOfName"];
return stringToReturn;
}
在这里,我获取对象并传递给视图控制器进行修改
...
detailViewController.unit = (ModelClass*)[fetchedResultsController
objectAtIndexPath:indexPath];
...
最后是数据修改
unit.subject = someTextField.text;
...
[unit.managedObjectContext save:&error]
我没有任何其他特殊的瞬态对象,所以我不直接修改它。
答案 0 :(得分:6)
没有看到围绕更新该瞬态属性的代码,我不得不猜测你有一个KVO问题。你可以发布代码吗?
您是否有主题的自定义设置器?如果没有,您是否为uppercaseFirstLetterOfName
设置了从属密钥?如果没有,那么这就是你的问题。更改一个值不会触发另一个值更改。这是一个KVO情况。
NSFetchedResultsController专门观察uppercaseFirstLetterOfName
并等待它改变。它不只是在观察要改变的对象。因此,当您更改主题时,您还需要“标记”uppercaseFirstLetterOfName
。最简单的方法是将以下方法添加到NSManagedObject
子类:
+ (NSSet*)keyPathsForValuesAffectingUppercaseFirstLetterOfName
{
return [NSSet setWithObject:@"Subject"];
}
这将告诉KVO,每当subject
属性发生更改时,它也应该触发UppercaseFirstLetterOfName
的更改通知。