もともと、アウトレットを介して NSTableView にデータを入力していて、テーブルの dataSource をコントローラー クラスに設定していました。アプリで列による並べ替えを有効にできるように、NSArrayController の使用に切り替えようとしています。
IB では、Array Controller オブジェクトを追加しました。並べ替え記述子バインディングを Shared User Defaults Controller に接続して、並べ替えられた列をアプリの起動間で保持できるようにします。テーブルの各列を配列コントローラーにバインドし、コントローラー キーを「arrangedObjects」に設定し、モデル キー パスをレンダリングするフィールドの名前に設定します。
私のデータは Core Data から来ており、表示しようとしているエンティティには別のエンティティとの関係があります。2 番目のエンティティの属性は、テーブル列の 1 つの値として表示する必要があります。ここで欠けているものについて、誰か考えや提案がありますか?
MainWindowController.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
MainWindowController.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:)];
}