无法将NSArray绑定到NSArrayController

时间:2015-10-16 01:43:04

标签: objective-c nstableview cocoa-bindings

我有一个数组(_websites)返回2个结果(我可以使用NSLog查看记录)。

我要做的是在NSTableView中显示有3列的那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与Content Content中的ContentArray绑定,然后我将NSTableView绑定到NSArrayController,以及我的表列,但是我得到空的NSTableView ...没有错误是无论如何都显示在控制台中。

1 个答案:

答案 0 :(得分:1)

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

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

相反,Xib中的数组控制器已取消归档并在websites之前绑定到viewDidLoad,因此此时websitesnil。接下来,您永远不会触发任何有关websites更改值的KVO通知,因为您明确避免使用websites访问者setWebsites,而是使用直接实例变量访问。因此,AC永远不会知道websites更改,并且该表永远不会反映websitesnil之外的任何值。

一般情况下,永远不要使用实例变量来访问属性的值,除非您有充分的理由这样做并完全理解为什么要这样做。