如何从其他选项卡中在tabbar中推送其他视图?

时间:2011-12-20 09:32:22

标签: iphone ios navigation uitabbarcontroller tabbar

我有tabbar - 每个都有两个带导航控制器的标签。我在第二张卡上更改了数据库,所以我需要在第一张卡上刷新数据(我知道viewWillAppear)。但是有导航控制器,我可以在它的下一个视图。

(不幸的是,我有带导航栏的tabbar,连接静态 - 通过.XIB)

如何在第一个标签页(第二个标签页)中返回导航控制器中的第一个视图?或者我如何推动其他观点,但不要破坏导航控制器?

2 个答案:

答案 0 :(得分:1)

在你的第一个标签的viewWillAppear中,你想要弹出到根视图控制器:

[self.navigationController popToRootViewControllerAnimated:YES];

您无法通过第二个标签执行此操作。但是,您可以在某处设置标志,例如在nsuserdefaults或您的数据库和viewWillAppear(在您的第一个选项卡中)检查此标志以查看是否需要弹出到根视图控制器。

答案 1 :(得分:1)

您需要将第一个标签栏中的导航控制器弹出到root,[firstTabBarViewController.navigationController popToRootViewControllerAnimated:NO];

唯一的问题是你需要引用你的第一个标签视图控制器。

你可以做到的另一种方式(我之前使用过这种方法)是使用本地通知。

在您的第一个视图控制器viewDidLoad方法中添加以下行以注册通知,您可以将通知命名为任何类似DatabaseChangedNotification的通知。

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(databaeHasChanged:) name:@"DatabaseChangedNotification" object:nil]; 

然后添加一个名为databaseHasChanged的新(void)方法,每次引发通知时都会调用此方法。您的databaseHasChanged方法应如下所示:

-(void)databaseHasChanged
{
    [self.navigationController popToRootViewControllerAnimated:NO];
}

然后在您的dealloc方法中,确保使用以下代码取消注册通知:

   [[NSNotificationCenter defaultCenter] removeObserver:self];

上面的代码将设置你的第一个视图控制器来监听和处理DatabaseChangedNotification。

现在您需要做的就是在第二个视图控制器中添加一些代码来更改数据库。数据库更改后,只需使用以下代码触发DatabaseChangedNotification:

[[NSNotificationCenter defaultCenter] postNotificationName:@"DatabaseChangedNotification"
                                                    object:nil];