将 NSArray 与 NSArrayController 绑定并在 NSTableView 中显示结果
Bind an NSArray with NSArrayController and display the results in NSTableView
我处理琐碎的核心数据,非基于文档的 cocoa 应用程序。我的核心数据中有 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,它在属性控制器中具有以下内容:Mode = Class、ClassName = CombinedViewContoller 并且两个复选框都被选中,即 Prepares Content 和 Editable。在绑定中,我已将管理对象上下文设置为文件所有者、模型键路径 self.mObjContext.
NSTable 与此 NSArrayContoller 绑定,如果我只保留第一列,即 websiteUrl,我会得到结果。
我的 .m 文件中的 NSLog 行,打印结果。但是应用程序崩溃并出现以下错误:
[valueForUndefinedKey:]:实体网站不符合键 "hostingProvider" 的键值编码。
任何帮助将不胜感激。纠结这4-5天,解决不了
我认为您需要为您的数据模型生成 NSManagedObject 子类。如果还没有,请加载数据模型文件并在“编辑器”菜单下查找该选项。
如果不是,请查看 troubleshooting core data page,因为它特别提到了您的错误和一些解决方案。祝你好运,伙计,如果有的话,让我知道什么有效。 4-5 天....我感觉到你的痛苦。
核心数据、NSArrayController 和 NSTableView 很容易,如果你知道怎么做的话。
阵列控制器:
将模式设置为实体名称。
将实体名称设置为实体的名称。
检查准备内容和 Editable.
将托管对象上下文绑定到托管对象上下文。
Table 查看:
将Content绑定到数组控制器,Controller Key arrangedObjects.
将选择索引绑定到数组控制器,Controller Key selectionIndexes.
将排序描述符绑定到数组控制器,Controller Key sortDescriptors.
将 table 视图单元格的值绑定到 Table 单元格视图,模型键路径 objectValue.websiteUrl。检查有条件地设置 Editable.
就是这样。
我处理琐碎的核心数据,非基于文档的 cocoa 应用程序。我的核心数据中有 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,它在属性控制器中具有以下内容:Mode = Class、ClassName = CombinedViewContoller 并且两个复选框都被选中,即 Prepares Content 和 Editable。在绑定中,我已将管理对象上下文设置为文件所有者、模型键路径 self.mObjContext.
NSTable 与此 NSArrayContoller 绑定,如果我只保留第一列,即 websiteUrl,我会得到结果。
我的 .m 文件中的 NSLog 行,打印结果。但是应用程序崩溃并出现以下错误:
[valueForUndefinedKey:]:实体网站不符合键 "hostingProvider" 的键值编码。 任何帮助将不胜感激。纠结这4-5天,解决不了
我认为您需要为您的数据模型生成 NSManagedObject 子类。如果还没有,请加载数据模型文件并在“编辑器”菜单下查找该选项。
如果不是,请查看 troubleshooting core data page,因为它特别提到了您的错误和一些解决方案。祝你好运,伙计,如果有的话,让我知道什么有效。 4-5 天....我感觉到你的痛苦。
核心数据、NSArrayController 和 NSTableView 很容易,如果你知道怎么做的话。
阵列控制器:
将模式设置为实体名称。
将实体名称设置为实体的名称。
检查准备内容和 Editable.
将托管对象上下文绑定到托管对象上下文。
Table 查看:
将Content绑定到数组控制器,Controller Key arrangedObjects.
将选择索引绑定到数组控制器,Controller Key selectionIndexes.
将排序描述符绑定到数组控制器,Controller Key sortDescriptors.
将 table 视图单元格的值绑定到 Table 单元格视图,模型键路径 objectValue.websiteUrl。检查有条件地设置 Editable.
就是这样。