3

メニューベースのナビゲーションがあります。メニューはtableViewです。ユーザーがそのテーブルの 1 つのエントリを押すたびに、別のビューコントローラーに切り替えたいと思います。プッシュされたビューがある場合は、最初にナビゲーション スタックをクリーンアップしたいと考えています。

これが私がしていることです

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    [(UINavigationController *)self.tabBar.selectedViewController popToRootViewControllerAnimated:YES];


    self.tabBar.selectedIndex = indexPath.row;

}

しかし

    self.tabBar.selectedIndex = indexPath.row;

popToRoot アニメーションを終了させないでください。アニメーションがいつ終了したかを知る方法はありますか?

ありがとう

4

3 に答える 3

5

rootViewController で、 rootViewController を呼び出す- (void)viewDidAppear:(BOOL)animatedと、アニメーションが終了したことを意味します。

rootViewControllers でコーディングできます- (void)viewDidAppear:(BOOL)animated

現在の ViewController にコーディングする必要がある場合は、次の 2 つの方法があると思います。

1.メッセージを送信するために使用をdelegate呼び出すときに、 rootViewController にaを追加します- (void)viewDidAppear:(BOOL)animateddelegate

2.通知の投稿を呼び出すときに、rootViewController に通知を追加し- (void)viewDidAppear:(BOOL)animatedます。そして、現在のViewControllerで通知を受け取ることができます

于 2013-02-06T09:19:57.250 に答える
2

受け入れられた回答のデリゲートまたは通知メソッドは正常に機能しますが、トランジションの中間の宛先にすぎないルート ビュー コントローラーにロジックを渡さないため、このメソッドの方が便利だと思います。

Core Animation トランザクションを使用できます。このようにして、ナビゲーション コントローラーが提供しない完了ブロックが得られます。

ブロックの前に tabbarcontroller 変数をキャプチャします。これを行わないと、ブロック内で tabbarcontroller が nil になるためです。ブロックが終了して消えるため、保持サイクルは作成されません

[CATransaction begin];
UITabBarController *tabController = self.navigationController.tabBarController;
[CATransaction setCompletionBlock:^{
    tabController.selectedIndex = 2;
}];

[self.navigationController popToRootViewControllerAnimated:YES];

[CATransaction commit];

答えは Joris Kluivers answer here からコピーされましたpopViewController の完了ブロックで、私にとっては完璧に機能します

于 2015-07-21T16:59:18.697 に答える
0

私にとってはうまくいった答えはありませんでした。私にとってうまくいった唯一のアイデアは、どのコントローラーがいつ提示されたかを追跡することです。
例: https://github.com/dzenbot/iOSBlocks/blob/master/Source/UIKit/UINavigationController%2BBlock.m

この回答で提示された同じ手法: https://stackoverflow.com/a/20565780/1400119
唯一の違い: github - カテゴリ、回答 - サブクラス

于 2015-10-22T20:18:37.680 に答える