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を解放する必要があります。ただし、これはiphone3.0シミュレーターでは機能します。
ただし、このコードを使用している場合、メモリ解放はどのように処理する必要がありますか?ビューコントローラの元のNSArrayを取得して、すべてを解放する必要がありますか?