将 NSArray 与 NSArrayController 绑定并在 NSTableView 中显示结果
Posted
技术标签:
【中文标题】将 NSArray 与 NSArrayController 绑定并在 NSTableView 中显示结果【英文标题】:Bind an NSArray with NSArrayController and display the results in NSTableView 【发布时间】:2015-10-22 00:48:35 【问题描述】:我从事琐碎的核心数据,非基于文档的可可应用程序。我的核心数据中有 3 个实体,它们具有一对一的关系。
实体可见下图:
我可以设法在控制台日志中显示这些值,但我无法在 NSTableView 中显示它们。
这是我的代码:
.h 文件:
#import <Cocoa/Cocoa.h>
#import "AppDelegate.h"
@interface CombinedViewController : NSViewController <NSTableViewDataSource>
@property (nonatomic,strong) NSManagedObjectContext *mObjContext;
@property AppDelegate *appDelegate;
@property (strong) IBOutlet NSArrayController *combinedRecordsArrayController;
@property (nonatomic,strong)NSArray *websites;
@property (weak) IBOutlet NSTableView *combinedTableView;
@property(strong,nonatomic)NSString *hostingProvider;
@property(strong,nonatomic)NSString *customerName;
@property(strong,nonatomic)NSString *websiteUrl;
@end
.m 文件
#import "CombinedViewController.h"
#import "Website.h"
#import "Customer.h"
#import "Hosting.h"
@interface CombinedViewController ()
@end
@implementation CombinedViewController
- (void)viewDidLoad
[super viewDidLoad];
_appDelegate = (AppDelegate*)[[NSApplication sharedApplication] delegate];
self.mObjContext = _appDelegate.managedObjectContext;
-(void)viewDidAppear
[self getCombinedResutls];
-(NSArray *)getCombinedResutls
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Website" inManagedObjectContext:self.mObjContext];
[fetchRequest setEntity:entity];
NSError *error = nil;
NSArray *fetchedObjects = [self.mObjContext executeFetchRequest:fetchRequest error:&error];
if (fetchedObjects == nil)
NSLog(@"Error:%@",error);
self.websites = [self.mObjContext executeFetchRequest:fetchRequest error:nil];
for (Website *ws in self.websites)
self.hostingProvider = ws.hostingInfo.hostingProvider;
self.customerName = ws.customerInfo.customerName;
NSLog(@"Website: %@, Customer: %@, Hosting Provider: %@", ws.websiteUrl, self.customerName, self.hostingProvider);
return self.websites;
@end
我有一个名为 CombinedRecordsArrayController 的 NSArrayController,它在属性 contoller 中具有以下内容:Mode = Class、ClassName = CombinedViewContoller 并且两个复选框都被选中,它们是 Prepares Content 和 Editable。在绑定中,我将管理对象上下文设置为文件所有者,模型键路径 self.mObjContext。
NSTable 与这个 NSArrayContoller 绑定,如果我只留下第一列,即 websiteUrl,我得到结果。
我的 .m 文件中的 NSLog 行,打印结果。但是应用程序崩溃并出现以下错误:
[valueForUndefinedKey:]:实体网站不符合键“hostingProvider”的键值编码。 任何帮助将不胜感激。我在这4-5天里苦苦挣扎,我无法解决。
【问题讨论】:
【参考方案1】:Core Data、NSArrayController 和 NSTableView 很简单,如果你知道怎么做的话。
阵列控制器: 将模式设置为实体名称。 将实体名称设置为实体的名称。 检查准备内容和可编辑。 将托管对象上下文绑定到托管对象上下文。
表格视图: 将 Content 绑定到数组控制器,Controller Key 排列对象。 将选择索引绑定到数组控制器,控制器键 selectionIndexes。 将排序描述符绑定到数组控制器,控制器键 sortDescriptors。 将表格视图单元格的值绑定到表格单元格视图,模型键路径 objectValue.websiteUrl。检查条件集可编辑。
就是这样。
【讨论】:
我做不到最后一步。我没有表格视图单元格,我有表格列和表格单元格。我无法将它绑定到表格单元格视图,我的选项是:文件所有者、应用程序、ArrayController 和共享用户默认值...我猜最后一步是针对 ios 的,而不是针对 OS-X...如果你能澄清最后一步就好了 以防我的问题不清楚:在 nstable 视图中,我有 3 列。每一列,应该由不同的实体填充。字段客户名称在客户实体中,字段 providerName 在 Hosing 实体中,websiteUrl 在网站实体中。 更新:我找到了如何做最后一步,我不得不切换到基于视图来做,但我仍然做同样的错误:[我认为您需要为您的数据模型生成 NSManagedObject 子类。如果还没有,请加载数据模型文件并在编辑器菜单下查找该选项。
如果不是这样,请查看troubleshooting core data page,因为它特别提到了您的错误和一些解决方案。祝你好运,让我知道如果有什么有用的话。 4-5天....我感觉到你的痛苦。
【讨论】:
不,你不需要生成 NSManagedObject 子类。 我已经做到了,我所有的实体都是子类的。这里的问题如下: 在 nstable 视图中,我有 3 列。每一列,应该由不同的实体填充。以上是关于将 NSArray 与 NSArrayController 绑定并在 NSTableView 中显示结果的主要内容,如果未能解决你的问题,请参考以下文章
将 NSArray 与 NSArrayController 绑定并在 NSTableView 中显示结果
将 Mantle 与核心数据一起使用 - NSSet 和 NSArray
如何将 NSArray 拆分为按字母顺序排列的部分以与索引表视图一起使用
NSDictionary 与 NSArray 正在转换为元素数组,同时使用 AfNetworking 2 将数据发布到 PHP