私は、prepareForSegue が終了した後に viewDidLoad が呼び出されるという印象を受けました。これは Hegarty がスタンフォード大学のクラスで教えている方法です (最近では 2013 年 2 月まで)。
しかし、今日初めて、viewDidLoad が prepareForSegue が終了する前に呼び出されたことに気付きました。したがって、prepareForSegue で設定していたプロパティは、destinations viewDidLoad メソッド内の destinationViewController では使用できませんでした。
これは、予想される動作に反するようです。
アップデート
私は何が起こっているのかを理解しました。私のdestinationViewControllerには、「モデル」が更新されるたびにtableViewをリロードするカスタムセッターがありました:
DestinationViewController
- (void)setManagedObjectsArray:(NSArray *)managedObjectsArray
{
_managedObjectsArray = [managedObjectsArray copy];
[self.tableView reloadData];
}
destinationViewController は UITableViewController のサブクラスであるため、「self.tableView」を呼び出すとビューが強制的に読み込まれます。Apple のドキュメントによると、ビュー コントローラーのビュー プロパティを呼び出すと、ビューが強制的に読み込まれる可能性があります。UITableViewController のビューは tableView です。
したがって、prepareForSegue の次の行は、destinationViewController のビューを強制的にロードしていました。
vc.managedObjectsArray = <custom method that returns an array>;
この問題を解決するために、destinationViewController のモデルのカスタム セッターを次のように変更しました。
- (void)setManagedObjectsArray:(NSArray *)managedObjectsArray
{
_managedObjectsArray = [managedObjectsArray copy];
if ([self isViewLoaded]) {
[self.tableView reloadData];
}
}
これは、tableView が画面上にある場合にのみ、tableView をリロードします。したがって、prepareForSegue 中にビューを強制的にロードすることはありません。
このプロセスに反対する人がいる場合は、あなたの考えを共有してください。そうでなければ、これが誰かの長い眠れぬ夜を防ぐことを願っています.