无法将 NSArray 与 NSArrayController 绑定

Can't bind NSArray with NSArrayController

我有一个数组 (_websites),其中 returns 2 个结果(我可以使用 NSLog 查看记录)。

我想要做的是在具有 3 列的 NSTableView 中显示这 2 条记录。我多次尝试将数组的内容与 NSArrayController 绑定,但都没有成功。

这是.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 *tableView;

@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;
    [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);
    }
    _websites = [_mObjContext executeFetchRequest:fetchRequest error:nil];

    for (Website *ws in _websites) {
        Customer *cust = ws.customerInfo;
        Hosting *host = ws.hostingInfo;

        NSLog(@"Website: %@, Customer: %@, Hosting Provider: %@",ws.websiteUrl, cust.customerName, host.hostingProvider);

    }

return fetchedObjects;
}


@end

我正在尝试学习如何使用 cocoa 绑定和编程方式来实现这两种方法,因此我们将不胜感激任何类型的解决方案。也非常欢迎提供一些最新教程的链接。

我只是忘了提...我在控制器内容中将 NSArrayController 与 ContentArray 绑定,然后将 NSTableView 与 NSArrayController 以及我的 Table 列绑定,但是我得到的是空的 NSTableView...控制台中没有显示任何错误。

如果您使用直接 iVar 访问-- _websites-- 来写入 websites 属性 的 iVar,绑定所依赖的 KVO 通知永远不会发生。

如果您改为使用 self.websites = 或更明确地 [self setWebsites: ...,那么您将向数组控制器触发 KVO 通知,告知网站 属性 的值已更新。

相反,Xib 中的数组控制器未存档并绑定到 viewDidLoad 之前的 websites,因此此时 websitesnil。随后,您永远不会触发任何关于 websites 更改值的 KVO 通知,因为您明确避免使用 websites 访问器 setWebsites 而是使用直接实例变量访问。因此 AC 永远不知道 websites 发生变化,并且 table 永远不会反映 websites 的任何值,除了 nil.

通常不要使用实例变量来访问 属性 的值,除非您有充分的理由这样做并且完全理解您这样做的原因。