3

我有一个基于菜单的导航。菜单是一个tableView。每次用户按下该表中的一个条目时,我都想切换到另一个视图控制器,如果有任何视图被推送,我想先清理导航堆栈。

这就是我正在做的

- (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 中编码,我认为它有两种方式:

1.在rootViewController中添加一个delegate,当调用- (void)viewDidAppear:(BOOL)animated使用delegate发送消息时

2.在rootViewController中添加一个通知,当调用- (void)viewDidAppear:(BOOL)animated发布通知时。在您当前的 ViewController 中,您可以收到通知

于 2013-02-06T09:19:57.250 回答
2

已接受答案的委托或通知方法工作正常,但我发现此方法更方便,因为它不会将任何逻辑传递给仅作为过渡的中间目的地的根视图控制器。

您可以使用 Core Animation 事务。这样你就有了导航控制器不提供的完成块。

我在块之前捕获 tabbarcontroller 变量,因为如果我们不这样做,tabbarcontroller 将在块中为零。它不会创建任何保留周期,因为块结束并消失

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

[self.navigationController popToRootViewControllerAnimated:YES];

[CATransaction commit];

答案是从 Joris Kluivers 的答案中复制的 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 回答