无法将 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
,因此此时 websites
是 nil
。随后,您永远不会触发任何关于 websites
更改值的 KVO 通知,因为您明确避免使用 websites
访问器 setWebsites
而是使用直接实例变量访问。因此 AC 永远不知道 websites
发生变化,并且 table 永远不会反映 websites
的任何值,除了 nil
.
通常不要使用实例变量来访问 属性 的值,除非您有充分的理由这样做并且完全理解您这样做的原因。
我有一个数组 (_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
,因此此时 websites
是 nil
。随后,您永远不会触发任何关于 websites
更改值的 KVO 通知,因为您明确避免使用 websites
访问器 setWebsites
而是使用直接实例变量访问。因此 AC 永远不知道 websites
发生变化,并且 table 永远不会反映 websites
的任何值,除了 nil
.
通常不要使用实例变量来访问 属性 的值,除非您有充分的理由这样做并且完全理解您这样做的原因。