UINavigationController popToRootViewController、そしてすぐに新しいビューをプッシュする質問する

UINavigationController popToRootViewController、そしてすぐに新しいビューをプッシュする質問する

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.navigationControllernil[self.navigationController pushViewController:someOtherViewController]nil

回避するには、navigationController へのローカル参照を設定し、代わりにそれを使用します。

UINavigationController * navigationController = self.navigationController;
[navigationController popToRootViewControllerAnimated:NO];
[navigationController pushViewController:someOtherViewController animated:YES];

Jason が述べたように、これを正しく動作させるには、popToRootViewController をアニメーションなしで実行する必要があります。

感謝しますApple フォーラムの jpimbertこれを指摘していただきありがとうございます。

おすすめ記事