2 つのタブを持つ tabBarController があり、最初のタブには NavigatorController のインスタンスが含まれています。navigatorController は、tableView 上のすべてのネットワーク ピアを一覧表示するカスタム viewController「peersViewController」で初期化されます。ピアを選択すると、「FilesListViewController」のインスタンス (c:\ ディレクトリ内のファイルを一覧表示する) が navigationController スタックにプッシュされます。
この filesListViewController には、ドキュメント ディレクトリに移動するためのボタンがあります。これを行うには、rootViewController で gotoDirectory:(NSString*)path メソッドを呼び出すようにインターフェイスを接続します。
- (void)gotoDirectory:(NSString*)path {
[[self navigationController] popToRootViewControllerAnimated:YES];
NSArray *files = [self getFilesFromPeerAtPath:path];
FilesListViewController *filesVC = [[FilesListViewController alloc] initWithFiles:files];
[[self navigationController] pushViewController:filesVC animated:YES];
[filesVC release];
}
ただし、そのボタンを押すと、navigationController はビューをルート ビュー コントローラーにポップしましたが、インスタンス化した FilesListViewController は表示されませんでした。ログから、カスタム initWithFiles メソッドが実際に呼び出され、ネットワーク関連の処理によってファイル名が取得されたことがわかります。
これには他にもおかしな点があります。2 番目のタブをクリックしてから最初のタブに戻ってみると、なんと、必要なファイル名がそこにありました。データと filesListViewController は確かに navigatorController スタックにプッシュされたようですが、表示は更新されず、rootViewController (peersViewController) の画面で停止しました。
何か間違ったことをしているのでしょうか?
--ベン。
-- 質問を投稿してから約 15 分後に編集しました。回避策は見つかりましたが、ポップしてからプッシュしても機能しないのが気になります。
- (void)gotoDirectory:(NSString*)path {
PeersListViewController *rootViewController = (PeersListViewController*)[[[self navigationController] viewControllers] objectAtIndex:0];
[[self navigationController] setViewControllers:[NSArray arrayWithObject:rootViewController]];
FilesListViewController *filesVC = [[FilesListViewController alloc] initWithFiles:files];
[[self navigationController] pushViewController:filesVC animated:YES];
[filesVC release];
}
navigationController をこの方法で回避することはできないようです。おそらく、元のスタックにあったすべての viewController を解放する必要があるでしょう。ただし、これは iPhone 3.0 シミュレータでは機能します。
ただし、このコードを使用する場合、メモリの解放はどのように処理する必要がありますか? ビューコントローラーの元の NSArray を取得してすべてを解放する必要がありますか?
ベストアンサー1
この問題とその解決策は実は非常に単純です。
を呼び出すと、が に[self.navigationController popToRootViewControllerAnimated:YES]
設定されます。その後に を呼び出すと、実質的に にメッセージが送信されますが、何も起こりません。self.navigationController
nil
[self.navigationController pushViewController:someOtherViewController]
nil
回避するには、navigationController へのローカル参照を設定し、代わりにそれを使用します。
UINavigationController * navigationController = self.navigationController;
[navigationController popToRootViewControllerAnimated:NO];
[navigationController pushViewController:someOtherViewController animated:YES];
Jason が述べたように、これを正しく動作させるには、popToRootViewController をアニメーションなしで実行する必要があります。
感謝しますApple フォーラムの jpimbertこれを指摘していただきありがとうございます。