0

サブビューで定義されたプロパティを介してオブジェクトを渡し、プッシュする前に割り当てるビューコントローラーがいくつかあります。後続のビューのオブジェクトへの変更が親ビューに反映され、最終的にチェーンが開始するメインのビューコントローラーに反映されることを期待していました。したがって、オブジェクトは新しいインスタンスとしてView Controller間でコピーする必要があり、参照(ポインタ)によって渡されないようにする必要があります。

コードサンプル... [わかりやすくするために、このコードはUIPopoverControllerを使用しています]

SurveyListTableViewController *surveyList = [[SurveyListTableViewController alloc] init];
surveyList.surveys = self.surveys;
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:surveyList];
surveyPopoverController = [[UIPopoverController alloc] initWithContentViewController:navController];

別のコードサンプル...[このサンプルには、CoreData管理対象オブジェクト「Plan」が渡されています]

UIStoryboard *storyboard = mainCanvasViewController.storyboard;
AddPlanViewController *addPlanViewController = [storyboard instantiateViewControllerWithIdentifier:@"AddPlanViewController"];
addPlanViewController.plan = [NSEntityDescription insertNewObjectForEntityForName:@"Plan" inManagedObjectContext:self.managedObjectContext];
[self.navigationController pushViewController:addPlanViewController animated:YES];

とにかく、値/コピーではなく参照/ポインターで強制的に渡すことができますか?または、完全に別のアプローチが必要ですか?...

よろしくお願いします。マイケル。

4

2 に答える 2

0

設定しているプロパティのセマンティクスを確認してください。一部のプロパティは、設定されているものをコピーするように設定されていますが、他のプロパティは、そのものを保持するために設定されています。たとえば、文字列のプロパティは、ほとんどの場合copy2つの理由で設定されます。1)NSStringのような不変の型は、とにかくコピーする代わりに保持します。2)誰かが可変の文字列を渡した場合、通常は変更したくありません。彼らの鼻のすぐ下。

とにかく、元のオブジェクトの代わりにコピーを扱っていることに気付く可能性が最も高い理由は、プロパティのセマンティクスがそのように設定されていることです。それが問題であることが判明し、プロパティがコードの一部である場合は、ニーズに合わせてプロパティ宣言を明らかに変更できます。それ以外の場合の解決策は、問題のView Controllerに処理を任せてから、プロパティを取得してから閉じることです。

于 2012-07-17T19:48:31.297 に答える
0

オブジェクトを渡す場合、ほとんどの場合、(コピーではなく) オブジェクトへの参照を渡します。コピーを渡すことは、実際にはそれほど簡単ではありません。

変更がオリジナルに反映されていないためにコピーだと思われる場合は、実際に変更を保存していることを確認してください。オブジェクトに値を再割り当てしている可能性があります (別名、毎回初期化を呼び出してオブジェクトをリセットしています)。オブジェクトの宣言と初期化は 1 回だけにしてください。

正直なところ、最善の戦略は、編集したいオブジェクトを含む元のクラスへの参照を渡し、それらを操作することです。したがって、ポップオーバー コントローラーを使用して、 のような名前のプロパティを追加しますparentVC。次に、ポップオーバー内で実行できますparentVC.nameOfObject(オブジェクトがビュー コントローラーのプロパティである場合)。

于 2012-07-17T18:51:35.007 に答える