代码之家  ›  专栏  ›  技术社区  ›  CJ.

NSArrayController初始化

  •  7
  • CJ.  · 技术社区  · 15 年前

    pageArrayController = [[NSArrayController alloc] initWithContent:nil];
        [pageArrayController setManagedObjectContext:[self managedObjectContext]];
        [pageArrayController setEntityName:@"Page"];
        [pageArrayController setAvoidsEmptySelection:YES];
        [pageArrayController setPreservesSelection:YES];
        [pageArrayController setSelectsInsertedObjects:YES];
        [pageArrayController setClearsFilterPredicateOnInsertion:YES];
        [pageArrayController setEditable:YES];
        [pageArrayController setAutomaticallyPreparesContent:YES];
        [pageArrayController setSortDescriptors:[NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"index" ascending:YES]]];
        BOOL result = [pageArrayController setSelectionIndex:0];
    

    3 回复  |  直到 15 年前
        1
  •  16
  •   Elise van Looij    15 年前

    是的,NIB确实以一种特殊的方式初始化对象,有时很难弄清楚如何复制它。我也在苦苦挣扎,最终在苹果的《核心数据编程指南》中找到了答案>&燃气轮机;核心数据和Cooca绑定>&燃气轮机; Automatically Prepares Content Flag (感谢戴夫·费尔南德斯在节目中 Cocoa Dev 列表)。答案是,如果使用nil内容初始化arraycontroller,则还需要执行获取。

    BOOL result;
    NSArrayController *pageArrayController = [[NSArrayController alloc] initWithContent:nil];
    [pageArrayController setManagedObjectContext:[self managedObjectContext]];
    [pageArrayController setEntityName:@"Page"];
    NSError *error;
    if ([pageArrayController fetchWithRequest:nil merge:YES error:&error] == NO) 
         result = NO;
    else
    {
         //do all that other pageArrayController configuration stuff
         result = [pageArrayController setSelectionIndex:0];
    }
    

        2
  •  0
  •   Ryan_IRL    15 年前

    至于行为上可能存在差异的原因:

    也许您可以在代码中尝试以下内容:

    [pageArrayController bind:@"managedObjectContext"
                     toObject:self
                  withKeyPath:@"managedObjectContext"
                      options:nil];
    

        3
  •  0
  •   Joshua Nozzi    15 年前

    从何处创建/配置阵列控制器?核心数据堆栈可能尚未就绪,因此对[self-managedObjectContext]的调用可能返回nil。

    另外,如果可以使用Interface Builder很好地创建它,为什么要以编程方式创建它?该工具就在那里,并且运行良好(并且消除了许多可能的编码错误),因此,除非您有充分的理由不使用它,否则您不会帮自己任何忙。