代码之家  ›  专栏  ›  技术社区  ›  Pablo

NSFetchedResultsController和节的瞬态属性

  •  1
  • Pablo  · 技术社区  · 14 年前

    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 调用?

    升级版本:

    这是model子类中的瞬态属性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]
    

    对于瞬态对象,我没有其他特别的东西,所以我不会直接修改它。

    1 回复  |  直到 14 年前
        1
  •  6
  •   Marcus S. Zarra    14 年前

    如果没有看到关于这个瞬态属性的更新的代码,我只能猜测您有一个KVO问题。你能把密码贴出来吗?

    更新

    uppercaseFirstLetterOfName ? 如果没有,那就是你的问题。更改一个值不会触发另一个值的更改。这是一个KVO的情况。

    NSFetchedResultsController正在观察 大写名字的第一个字母 特别是等着它改变。它不仅仅是观察物体的变化。因此,当你改变主题时,你需要“标记” 我也很感动。最简单的方法是将以下方法添加到 NSManagedObject 子类:

    + (NSSet*)keyPathsForValuesAffectingUppercaseFirstLetterOfName
    {
      return [NSSet setWithObject:@"Subject"];
    }
    

    这将告诉KVO subject 属性已更改,它还应为其激发更改通知 UppercaseFirstLetterOfName .