2009-07-31 8 views
1

次のデザインのアプリケーションがあります。 ドキュメントを一覧表示するテーブルビューです。 およびドキュメントを編集するViewController。元の参照にオブジェクトのコピーを戻す方法を教えてください。

ドキュメントを編集するときに、オブジェクトのコピーを使用したい場合、ユーザーがキャンセルを押した場合にコピーを破棄します。ユーザーが[保存]を選択した場合は、変更したドキュメントをオリジナルにコピーします。 (多すぎるため、すべてのドキュメントのフィールドをviewControllerのプロパティとして持つことはできません)。

テーブルビューコントローラ:

SelectedRowAtIndex { 
    document= [documentsArray objectAtIndex:indexPath.row]; 
    viewController.assignedDocuemnt= document; 
} 

その後、私はアイテムが変更されたビューコントローラクラスがあります。

@interface 
@property (nonatomic,retain) Document *asignedDocument; 
@property (nonatomic,retain) Document *editedDocument; 

viewDidLoad{ 
    editedDocument= [assignedDocuemnt copy]; 
} 


IBAction save { 
    assignedDocument=editedDocument; 
} 

を私の問題はdocumentsArrayで原稿が編集されたバージョンに更新されないということです。 私は何を欠席しましたか?

答えて

2

あなたは値をコピーしてから、の参照先に参照番号を元に戻します。それは間違いなく動作しません。

まず、追加するドキュメントをテーブルビューのビューコントローラで追跡します。

そして、テーブルビューののViewControllerを相互に選択したドキュメントを交換するためのハンドラを追加します。

- (void)replaceSelectedDocument:(Document*)newDoc { 
    [documents replaceObjectAtIndex: editingIndex 
         withObject: newDoc]; 
} 

保存するには、のようなものでエディタビューコントローラからテーブルビューコントローラの新しいメッセージを呼び出します。

[tableViewController replaceSelectedDocument: editedDocument]; 

これを行うより良い方法は、エディタビューコントローラを変更して、テーブルビューコントローラに明示的にコールバックするのではなく、ターゲットとアクションをとることです。保存したい場合は、アクションを呼び出す:

[target performSelector: action withObject: editedDocument]; 

をしかし、それはあなたがおそらく今日の上に取得する必要はありません学習曲線上の別のバンプです。

+0

答えをありがとう。 「良い方法」の最後の部分について詳しく説明できますか?ドキュメント配列を別のDataクラスでシングルトンとして保持しています。 – Rod

+0

私は、テーブルビューコントローラに送るメッセージをハードコーディングするよりも優れています。 'replaceSelectedDocument'を送ると、それらのオブジェクトは永遠に結合されたことになります。代わりに、 'target:self action:@selector(replaceSelectedDocument:)'を渡した場合、柔軟性と結合性が失われてしまいました。エディタは実際にはテーブルビューコントローラによって呼び出されたことに気付かず、終了時に指定されたターゲットに指定されたメッセージ。 –

関連する問題