任何人都可以解释NSArrayContoller模式(Class/Entity)之间的实践差异吗?
我刚刚在我的基于文档的Core Data桌面应用程序中面临一些调试问题(使用所有控制器的实体模式).
我的数据库结构变得非常复杂,找到错误的绑定(错误的键路径等)需要花费很多时间.我还为我的数据模型中的每个实体生成了类.
如果我将所有控制器切换到类模式,它会跟踪绑定错误有什么不同吗?
从这个问题借来的标题,其中一个不重复.在那里看到我的答案,因为那个提问者出了什么问题; 我是那个答案的作者,而我的问题不是那个问题.
我有一个包含三列的表视图,其Value绑定绑定到arrangedObjects数组控制器的三个属性.数组控制器contentArray绑定到visitationResults我的文档对象; 该数组中的项是模型类(VisitationResult)的实例.我还绑定了数组控制器selectionIndexes和sortDescriptors我的文档的属性.
我通过几个访问者改变我的财产:
- (void) addVisitationResult:(VisitationResult *)newVisitationResult {
[self insertObject:newVisitationResult inVisitationResultsAtIndex:[self countOfVisitationResults]];
NSLog(@"arrayController arrangedObjects: %@", [arrayController arrangedObjects]);
}
Run Code Online (Sandbox Code Playgroud)
该NSLog语句运行,并确认阵列控制器正在收集和排列我的模型对象.这意味着我正在通过我的财产并获取我的文件的KVO通知(这证明了先前的提问者的问题,绕过该属性的问题,不是我遇到的问题).
我NSLog在模型对象类的访问器方法中添加了语句.其中一个是由数组控制器调用,以便对对象进行排序(该属性是排序键).阵列控制器不知道的其他两个从未被调用过.
因此,我的表格视图仍为空白.
我试图把我绑NSArraycontroller在一个NSMutableArray; 该数组包含"iData"类型的对象(它是一个自定义类).该类还包含一些NSMutableString变量,这些变量被设置为KVC的键.然后我将my绑定NSTableColumn到NSArrayController并分别设置每列的关键模型路径.
当我尝试填充数组时,GUI不会显示任何内容.我忘记了什么?
objective-c nstableview nstablecolumn nsarraycontroller cocoa-bindings
我有过滤NSArrayController的问题.Content Array绑定到包含NSDictionaries的NSMutableArray.我想过滤所有"name"键等于"a"的NSDictionaries.我的应用程序启动时运行这两行,但没有任何过滤.
NSPredicate *filter = [NSPredicate predicateWithFormat: @"name like %@", @"a"];
[arrayController setFilterPredicate: filter];
Run Code Online (Sandbox Code Playgroud) 有没有办法在XCode 4.2中重命名NSArrayController的实例?我问是因为有一些教程实现它,其中一个步骤是将'Array Controller'重命名为其他东西但是作者似乎正在使用旧版本的XCode,只需点击一下即可.最新版本有可能吗?谢谢.
经过几个小时/几天的搜索和潜入示例项目,我得出结论,我只需要问.如果我将assetsView(IKImageBrowserView)直接绑定到IB实例,那么NSArrayController一切正常.
- (void) awakeFromNib
{
library = [[NSArrayController alloc] init];
[library setManagedObjectContext:[[NSApp delegate] managedObjectContext]];
[library setEntityName:@"Asset"];
NSLog(@"%@", [library arrangedObjects]);
NSLog(@"%@", [library content]);
[assetsView setDataSource:library];
[assetsView reloadData];
}
Run Code Online (Sandbox Code Playgroud)
两者NSLogs都是空的.我知道我错过了什么......我只是不知道是什么.目标是最终允许使用谓词以编程方式过滤此视图的"库"的多个实例.现在我只是想让它显示"Asset"实体的所有行.
另外:如果我NSArrayController在IB中创建然后尝试记录[library arrangedObjects]或手动设置assetsView的数据源,我会得到相同的空结果.就像我之前说的那样,如果我绑定library.arrangedObjects到IB中的assetsView.content(IKImageBrowserView) - 具有相同的托管对象上下文和IB设置的相同实体名称 - 一切都按预期工作.
- (void) awakeFromNib
{
// library = [[NSArrayController alloc] init];
// [library setManagedObjectContext:[[NSApp delegate] managedObjectContext]];
// [library setEntityName:@"Asset"];
NSLog(@"%@", [library arrangedObjects]);
NSLog(@"%@", [library content]);
[assetsView setDataSource:library];
[assetsView reloadData];
}
Run Code Online (Sandbox Code Playgroud) 我有一个配置了模式'Entity'的NSArrayController,它包含所选类型为'Person'和'Prepares Content'的Core-Data-Entities.所有其他属性都是默认属性.正如所料,当我创建新的Person-entities时(通过按钮单击),此arraycontroller更新其arrangeObjects:
-(IBAction)addEntity:(id)sender{
Person* new = [NSEntityDescription insertNewObjectForEntityForName:@"Person"
inManagedObjectContext:[self managedObjectContext]];
new.text = @"text";
new.date = [NSDate date];
}
Run Code Online (Sandbox Code Playgroud)
我已将基于视图的NSTableView的内容绑定到此arrayController的'arrangeObjects'属性,以显示Persons.在一列中,我有一个可编辑的(但默认情况下是默认的)NSTextField绑定到TableCellView的'objectValue.text'属性.
如果我编辑表格中的"文本"属性并添加另一个人(当表格单元格仍处于编辑模式时),则表格失去焦点,编辑结束并且新人员显示在表格中.一切都很好看.
但是,如果我想添加另一个人,arrayController不会更新arrangeObjects属性(我发现不再调用arrayController的setContent:).
这是预期的行为吗?
macos core-data nstableview nsarraycontroller cocoa-bindings
我正在使用可可绑定、NSArrayController 和核心数据。启动后,应用程序必须获取第一项,我在 applicationDidFinishLaunching 中尝试此操作:
1. Entity *ent = arrayManager.arrangedObjects[0];
2. Entity *ent = arrayManager.selectedObjects[0];
Run Code Online (Sandbox Code Playgroud)
---> 错误说数组为空。为什么 ?
我不明白的另一件事是,当应用程序出现时,在 tableView 中有一个选定的行,但是当我记录时:
NSLog(@"selected row in applicationDidFinishLaunching = %li",self.TableViewController.tableView.selectedRow);
Run Code Online (Sandbox Code Playgroud)
log: -1--> 没有选择行!为什么 ?
可以让观察者了解的selectedIndex方法NSArrayController。我认为这种方法有一些缺点:
arrangedObjects重新排列时会发生什么?我承认这不是一个很重要的问题
如果我们要求观察者记住的旧值selectedIndex,则它不起作用。已知,但我找不到链接。
为什么NSArrayController没有委托?还有另一种方法可以实现我想做的事情:选择更改时启动一些方法?
我有一个 NSArrayController 和 NSTableView。所有绑定都运行良好,因此当我向数组添加新内容时,它会反映到表中。完美的。但是,在将内容插入数组时,表格视图会丢失当前选定的项目,这很烦人。我试图通过勾选“保留选择”复选框在 ArrayController 上打开它,但这没有帮助。
当新内容添加到我的数组时,如何保留 tableview 选定的行?
cocoa ×6
macos ×5
nstableview ×4
objective-c ×4
core-data ×3
filter ×1
mode ×1
nspredicate ×1
rename ×1
xcode ×1