我有一个数组(_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 ...没有错误是无论如何都显示在控制台中。
答案 0 :(得分:1)
如果您使用直接iVar访问权限 - _websites
- 来编写websites
属性的iVar,则绑定所依赖的KVO通知永远不会发生。
如果您改为使用self.websites =
或更明确[self setWebsites: ...
,那么您将触发向阵列控制器发出KVO通知,告知网站属性的值已更新。
相反,Xib中的数组控制器已取消归档并在websites
之前绑定到viewDidLoad
,因此此时websites
为nil
。接下来,您永远不会触发任何有关websites
更改值的KVO通知,因为您明确避免使用websites
访问者setWebsites
,而是使用直接实例变量访问。因此,AC永远不会知道websites
更改,并且该表永远不会反映websites
除nil
之外的任何值。
一般情况下,永远不要使用实例变量来访问属性的值,除非您有充分的理由这样做并完全理解为什么要这样做。