将 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.

就是这样。