1

私の NSPersistentDocument ベースのアプリケーションのメイン ビューは、レコードのリストを表示する (NSArrayController にバインドされた) テーブル ビューで、その下に [レコードの追加] ボタンがあります。ボタンが次の(おそらく些細な)動作を引き起こすようにしたい。

  1. 新しいオブジェクトを作成する
  2. 新しいオブジェクトにいくつかのデフォルトを設定します (メイン ドキュメントに保存され、グローバルには使用できません)。
  3. テーブル ビューに追加します。

私が試した、または却下したことは次のとおりです。

  1. NSArrayController の「追加」アクションを使用します - 問題: 新しいオブジェクトが返されず、実装が延期されるため、新しく作成されたオブジェクトを変更することはできません
  2. データ クラスの init をオーバーライドします - 機能しません - ドキュメント クラス インスタンスに格納されているデータにアクセスする必要があります
  3. ドキュメントに保存されているデータにアクセスする必要があるため、NSArrayController をサブクラス化し、"newObject" をオーバーライドしても機能しません。
  4. 次のコードは「ほぼ」機能しました:

    - (IBAction)newRecord:(id)sender
    {
        MyDataClass *newRecord = [recordsArrayController newObject];
    
        newRecord.setting1=self.defaultSetting1;
        newRecord.setting2=self.defaultSetting2;
        // ... etc...
        [recordsArrayController addObject:newRecord];
        [recordsTable scrollRowToVisible:[recordsTable selectedRow]];
        [newRecord release];    
    }
    

このコードは、保存されていないドキュメントに対して実際にうまく機能します。しかし、ドキュメントを保存して再度開くと、追加ボタンをクリックすると、新しいレコードがテーブルに 2 回表示されます。明らかに、「addObject」は冗長ですが (保存されていないドキュメントでは正常に機能しますが)、それがないと新しいオブジェクトは選択されません。

4

2 に答える 2

2

動作するはずの単純なケース:

MyDataClass *newRecord = [controller newObject];
// configure newRecord
[controller addObject:newRecord];
[newRecord release];

新しいオブジェクトを選択するには、コントローラが-setSelectsInsertedObjects:YES事前に設定されている必要があります。

しかし、私がより適切だと考える代替手段があります。NSArrayController を次のようにサブクラス化します (わずかな擬似コード):

@interface MyRecordController : NSArrayController
@property id recordSetting1;
@property id recordSetting2;
@end

@implementation MyRecordController

@synthesize recordSetting1;
@synthesize recordSetting2;

- (id)newObject
{
    id result = [super newObject];
    newRecord.setting1 = self.recordSetting1;
    newRecord.setting2 = self.recordSetting2;
    return result;
}

@end

したがって、コードは次のようになります。

- (IBAction)newRecord:(id)sender
{
    recordsArrayController.recordSetting1 = self.defaultSetting1;
    recordsArrayController.recordSetting2 = self.defaultSetting2;
    [recordsArrayController add:self];    
}
于 2010-01-25T18:49:13.993 に答える
1

本当に必要なことは、addObject:呼び出しを省略するようにコードを変更することだけです。新しいオブジェクトを選択するには、次のようにします。

[recordsArrayController setSelectedObjects:[NSArray arrayWithObject:newObject]];

への呼び出しを行う前にswcrollRowToVisible:addObject:電話が不要だというあなたの言う通りです。ご覧のとおり、配列コントローラーで 2 回終了しています。

また、電話する必要はありません[newRecord release]。ドキュメントによると、オブジェクトはアレイ コントローラーによって保持されます。2回目に保持されているため、今は失敗していませんaddObject:

于 2010-01-25T14:27:03.520 に答える