1

もともと、アウトレットを介して 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:)];
}
4

1 に答える 1

1

この問題には 2 つの解決策があります。

  1. 新しいオブジェクトを追加し、クラスをAppDelegateに設定して、App Delegate オブジェクトを IB に追加します。
  2. 以下のコードを .h および .m ファイルに追加して、ウィンドウをレンダリングするコントローラーのインスタンス変数appDelegateとして App Delegate を割り当てます。

Controller.h

@class AppDelegate;

@interface Controller : NSWindowController {
    AppDelegate <NSApplicationDelegate> *appDelegate;
}

Controller.m

#import "AppDelegate.h"

- (id) initWithWindowNibName:(NSString *)windowNibName
{
    self = [super initWithWindowNibName:windowNibName];
    if (self) {
        appDelegate = (AppDelegate *) [[NSApplication sharedApplication] delegate];
    }
    return self;
}

いずれの場合も、アレイ コントローラーの新しいバインドを追加する必要があります。Inspector の Binding ペインに移動し、Managed Object Context (Parameters の下) を Bind to (1) App Delegate または (2) File's Owner に設定し、Model Key Path を (1) self.managedObjectContext または ( 2) self.appDelegate.managedObjectContext

于 2012-08-29T19:58:44.183 に答える