将 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 在网站实体中。 更新:我找到了如何做最后一步,我不得不切换到基于视图来做,但我仍然做同样的错误:[ valueForUndefinedKey:]: the entity Website不符合键“hostingProvider”的键值编码。请阅读我之前的评论 您必须使用来自网站实体的关键路径:customerInfo.customerName hostingInfo.providerName websiteUrl 是的,做到了。谢谢!【参考方案2】:

我认为您需要为您的数据模型生成 NSManagedObject 子类。如果还没有,请加载数据模型文件并在编辑器菜单下查找该选项。

如果不是这样,请查看troubleshooting core data page,因为它特别提到了您的错误和一些解决方案。祝你好运,让我知道如果有什么有用的话。 4-5天....我感觉到你的痛苦。

【讨论】:

不,你不需要生成 NSManagedObject 子类。 我已经做到了,我所有的实体都是子类的。这里的问题如下: 在 nstable 视图中,我有 3 列。每一列,应该由不同的实体填充。

以上是关于将 NSArray 与 NSArrayController 绑定并在 NSTableView 中显示结果的主要内容,如果未能解决你的问题,请参考以下文章

NSArray 与 C 类型?

将 NSArray 与 NSArrayController 绑定并在 NSTableView 中显示结果

将 Mantle 与核心数据一起使用 - NSSet 和 NSArray

如何将 NSArray 拆分为按字母顺序排列的部分以与索引表视图一起使用

NSArray 与字符串

NSDictionary 与 NSArray 正在转换为元素数组,同时使用 AfNetworking 2 将数据发布到 PHP