0

私は小さなコアデータアプリを持っています。ビューとモデルの間のバインディングとして機能する NSObjectController のサブクラスと、ユーザーが入力するビューの NSTextField があります。

ウィンドウが開くと、テキスト フィールドが編集可能になります。これは、バインディングがサブクラス化された NSObjectController に設定され、コントローラー キーが "content" に設定され、Model Key Path がエンティティの属性に設定されているためです。

テキストを入力すると、ファイルを保存して再度開くと、NSTextField にテキストがありません。

テストのために、コントローラーの add: セレクターに接続されたボタンがあり、ボタンを押すとすべて正常に動作します。テキストを NSTextField に入力し、ドキュメントを保存し、再度開くことができます。

nib がロードされたときにオブジェクトを準備するにはどうすればよいですか?

NSObjectController のサブクラスの init メソッドには、次のものがあります。

[self setAutomaticallyPreparesContent:YES];

そして、私は MyDocument:windowControllerDidLoadNib にあります (oc は IB でサブクラス化された objectcontroller への IBOutlet です):

[oc fetchWithRequest:nil merge:NO error:&error];

しかし、うまくいきませんでした。ユーザーが入力を開始できるように、コンテンツを作成する必要があります。

ありがとう

4

1 に答える 1

0

OK、これが私の貢献です。何か答えていただけると嬉しいです!ドキュメントの「NSPersistentDocument Core Data Tutorial」でこれを見つけました。

覚えておいてください、私の問題は、NSManagedObject を作成したいドキュメントが作成されたときでした。そうすれば、ユーザーは「追加」ボタンを押す必要がありません。(ユーザーが何かを入力するまで) ドキュメントを汚したくありません。また、保存したファイルを開く場合にコンテンツを置き換えたくありません。これは、新しいドキュメントが作成されたときにのみ発生する必要があります。

NSDocument はメソッドを提供します:

initWithType:error:

これを達成するために。

1) managedObjectContext を取得します。

2) 元に戻すを一時的にオフにします。これにより、ドキュメントが汚れたり、ユーザーがエンティティの作成と挿入を元に戻したりするのを防ぐことができます。

3) insertNewObejctForEntityForName:inManagedObjectContext を使用する

4) 変更をインストールする

5) 元に戻す

コードは次のとおりです。

- (id)initWithType:(NSString *)typeName error:(NSError **)outError
{
    self = [super initWithType:typeName error:outError];
    if (self != nil) {
        NSManagedObjectContext *managedObjectContext = [self managedObjectContext];

        [[managedObjectContext undoManager] disableUndoRegistration];

        self.myManagedObject = [NSEntityDescription insertNewObjectForEntityForName:@"myEntityName" 
                                                      inManagedObjectContext:managedObjectContext];

        [managedObjectContext processPendingChanges];

        [[managedObjectContext undoManager] enableUndoRegistration];
        NSLog(@"initWithType");
    }
    return self;
}  
于 2009-12-29T20:43:11.020 に答える