最初我是通过一个插座填充我的 NSTableView 并将表的 dataSource 设置为我的控制器类。我正在尝试切换到使用 NSArrayController,以便可以在我的应用程序中启用按列排序。
在 IB 中,我添加了一个数组控制器对象。我将排序描述符绑定连接到共享用户默认控制器,以便排序列可以在我的应用程序启动之间保持不变。我将表的每一列都绑定到数组控制器,控制器键设置为“arrangedObjects”,模型键路径设置为应该呈现的字段的名称。
我的数据来自核心数据,我试图显示的实体与另一个实体有关系。第二个实体上的属性需要显示为表列之一的值。有人对我在这里缺少的东西有任何想法/建议吗?
主窗口控制器.h
#import <Cocoa/Cocoa.h>
#import "Notification.h"
@class AppDelegate;
@interface MainWindowController : NSWindowController <NSTableViewDataSource, NSTableViewDelegate> {
AppDelegate <NSApplicationDelegate> *appDelegate;
}
//@property NSMutableArray *userNotifications;
@property (weak) IBOutlet NSTableView *notificationsTable;
@property (weak) IBOutlet NSArrayController *notificationsController;
@end
主窗口控制器.m
#import "AppDelegate.h"
#import "MainWindowController.h"
#import "Utils.h"
@implementation MainWindowController
//@synthesize userNotifications;
@synthesize notificationsTable;
@synthesize notificationsController;
- (void) doubleClick:(id)sender
{
NSInteger row = [notificationsTable clickedRow];
// Notification *clickedNotification = [userNotifications objectAtIndex:row];
// Notification *clickedNotification =
// [appDelegate redirectToBrowser:clickedNotification];
}
- (id) initWithWindowNibName:(NSString *)windowNibName
{
self = [super initWithWindowNibName:windowNibName];
if (self) {
// userNotifications = [[NSMutableArray alloc] init];
appDelegate = (AppDelegate *) [[NSApplication sharedApplication] delegate];
[notificationsController setManagedObjectContext:[appDelegate managedObjectContext]];
[notificationsController setEntityName:@"Notification"];
[notificationsController setAutomaticallyPreparesContent:YES];
[notificationsController fetch:self];
[notificationsTable reloadData];
}
return self;
}
- (void)windowDidLoad
{
[super windowDidLoad];
// Implement this method to handle any initialization after your window controller's window has been loaded from its nib file.
[notificationsTable reloadData];
}
- (void)awakeFromNib
{
[notificationsTable setTarget:self];
[notificationsTable setDoubleAction:@selector(doubleClick:)];
}