0

巨大な質問に先延ばしにしないでください...(そのほとんどはコードです)。
OK、tableView を含むビュー コントローラー (AddClaim と呼ばれる) を含むナビゲーション コントローラーがあります。セルが選択されている場合、これが呼び出されます。

EditClaimDetails *detailViewController = [[[EditClaimDetails alloc] init] autorelease];

// Pass the selected object to the new view controller.
detailViewController.selectedIndexPath = indexPath;
detailViewController.newClaimArrayDetails2 = newClaimArrayDetails;
[self.navigationController pushViewController:detailViewController animated:YES ];

これはうまく機能し、tableView を含む新しいビュー コントローラーが表示されます (これは排他的なリストです)。

EditClaimDetails の ViewDidLoad には、次のコードが存在します: (claimTypeHoldingArray は、ヘッダー ファイルで宣言された可変配列です)

UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"Back"    style:UIBarButtonItemStyleBordered target:self action:@selector(pressedBack)];

self.navigationItem.leftBarButtonItem = backButton;

claimTypeHoldingArray = [[NSMutableArray alloc] initWithArray:newClaimArrayDetails2];

基本的に、これの結果は期待どおりです。[戻る] ボタンが表示されます (押すと、ビュー コントローラーを AddClaim にポップするセレクターが呼び出されます)。 claimTypeHoldingArray には、AddClaim で指定された newClaimsArray が含まれています。

これは didSelectRowAtIndexPath のコードの一部です: (claimTypeArray はセルの textLabels を保持する配列です)

[claimTypeHoldingArray replaceObjectAtIndex:0 withObject:[claimTypeArray objectAtIndex:indexPath.row]];

これにより、claimTypeHoldingArray の最初のオブジェクトが、セルの TextLabel にあったテキストに置き換えられます。ここまでは順調ですね。(nslog でテスト済み)

これは、戻るボタンが押されたときのコードです。

-(IBAction)pressedBack {

AddClaim *sender = [[[AddClaim alloc] init] autorelease];

sender.newClaimArrayDetails = claimTypeHoldingArray;

[self.navigationController popViewControllerAnimated:YES];

ここから問題が始まります... このアクション (私によると) は、newClaimArrayDetails を claimTypeHoldingArray に置き換える必要があります。(そうします)しかし、View Controllerがポップされ、画面が戻ってクレームを追加しても、この配列は変更されません!私は何を間違えましたか?! ところで、すべてのプロパティが設定されています。これは私がviewDidAppearで行うテストです:

NSLog(@"%@",[newClaimArrayDetails objectAtIndex:0]);
4

2 に答える 2

1

この回答は質問と同じスケールです。大きすぎないことを願っています;)

したがって、pressedBack ボタン メソッドでは、最初の AddClaim ビュー コントローラー オブジェクトを claimTypeHoldingArray で更新しようとしています。

あなたは半分正しいです - あなたは間違いなく AddClaim オブジェクトを更新していますが、ナビゲーション コントローラー内にあるオブジェクトではありません。新しいものを作成し、代わりにそれを更新しています!

-(IBAction)pressedBack {
    // This line creates a new AddClaim view controller
    AddClaim *sender = [[[AddClaim alloc] init] autorelease];

    // This line updates your _new_ AddClaim view controller
    sender.newClaimArrayDetails = claimTypeHoldingArray;

    // This line displays the _old_ AddClaim object
    [self.navigationController popViewControllerAnimated:YES];

EditClaimDetails ビュー コントローラーに、それを作成した AddClaim ビュー コントローラーを渡す必要があります。

あなたのセルが選択された方法で次のようなものを追加します

detailViewController.addClaimViewController = self;

( addClaimViewCONtroller は、 EditClaimDetails オブジェクトのプロパティです。

@property (nonatomic, retain) Addclaim *addClaimViewController;

次に、pressedBack メソッドは次のようになります。

-(IBAction)pressedBack {
    // This line updates your _old_ AddClaim view controller
    addClaimViewController.newClaimArrayDetails = claimTypeHoldingArray;

    // This line displays the _old_ AddClaim object
    [self.navigationController popViewControllerAnimated:YES];

それが役立つことを願っています。

于 2011-05-03T14:56:44.890 に答える
0

AddClaim で配列プロパティの定義を確認してください。もしかして (非アトミック、コピー) ですか? はいの場合、元の配列を変更できないように、配列のプライベートコピーを保持します。

于 2011-05-03T14:58:21.077 に答える