Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa NSArrayController初始化_Cocoa_Macos_Core Data_Nib_Nsarraycontroller - Fatal编程技术网

Cocoa NSArrayController初始化

Cocoa NSArrayController初始化,cocoa,macos,core-data,nib,nsarraycontroller,Cocoa,Macos,Core Data,Nib,Nsarraycontroller,我很难让核心数据支持的NSArrayController在我的代码中正常工作。下面是我的代码: pageArrayController = [[NSArrayController alloc] initWithContent:nil]; [pageArrayController setManagedObjectContext:[self managedObjectContext]]; [pageArrayController setEntityName:@"Page"];

我很难让核心数据支持的NSArrayController在我的代码中正常工作。下面是我的代码:

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];
当我尝试调用setSelectionIndex:时,它返回YES,表示选择已成功更改。但是,对pageArrayController对象的任何后续getSelectionIndex调用都会返回NSNotFound

我不明白的是,如果我将NSArrayController放入NIB中,并允许NIB文件执行初始化(使用Interface Builder中的所有相同属性),NSArrayController将正常工作

为什么行为上有差异?NIB文件是否以特殊方式初始化这些类型的对象?我对NSArrayController的初始化是否不正确


感谢您的帮助。谢谢。

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

  • Nib文件使用NSCoder存储序列化对象
  • 您可能正在IB端使用绑定,在代码中,您直接使用set方法设置托管对象上下文
  • 也许您可以在代码中尝试以下内容:

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

    我附近没有Xcode,否则我会尝试一些东西。希望这能为您提供一些线索,让您朝着正确的方向前进。

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


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

    是的,NIB确实以一种特殊的方式初始化对象,有时很难想出如何复制它。我也在苦苦挣扎,最终在苹果的核心数据编程指南>>核心数据和Cooca绑定>>中找到了答案(感谢名单上的Dave Fernandes)。答案是,如果使用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];
    }
    

    顺便说一句,[NSSortDescriptor sortdescriptor with key:@“index”升序:YES]]会引发警告。

    没有
    -getSelectionIndex
    方法。您是自己编写了这样一个方法,还是实际调用了其他方法?我的意思是-selectionIndex。此外,您使用[self-managedObjectContext]意味着您已将pageArrayController方法添加到appDelegate中。这被认为是不好的做法。您确实应该考虑创建一个单独的页面控制器对象(以及实现MVC模式所需的模型和视图对象),该对象将负责应用程序的整个页面功能。页面控制器或页面模型对象可以在必要时调用[[NSApp delegate]managedObjectContext]。感谢此解决方案,它可以完美地工作。现在我的应用程序结构更好了,我可以用代码创建这些数组控制器,而不是依赖NIB。我的朋友,你是一个传奇!我花了好几天的时间试图弄明白,当新数据从iCloud进入我的核心数据存储时,为什么我的阵列控制器没有更新。现在它工作得很好。谢谢。那么,您如何将
    NSTableView
    连接到这个通过编程创建的
    NSArrayController
    ?在代码中,还是可以使用Interface builder?您需要代码来建立绑定,但tableview可以在IB中创建。只需确保向tableview声明一个IBOutlet,然后执行以下操作:[self.theTableView.column bind:NSValueBinding to Object:theArrayController with KeyPath:[NSString stringWithFormat:@“arrangedObjects.%@],anatributename]options:theValueOptions];在我的例子中,我在代码中创建了NSArrayController,就像在使用IB时一样,NSArrayController中的绑定数据还没有加载到
    awakeFromNib
    方法中。您知道如何解决IB中的问题吗?