【问题标题】:How to push other view in tabbar from other tab?如何从其他选项卡推送选项卡栏中的其他视图?
【发布时间】:2011-12-20 09:32:21
【问题描述】:

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

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

如何在第一个选项卡(从第二个选项卡)上返回导航控制器中的第一个视图?或者我如何在它上面推送其他视图,但不破坏导航控制器?

【问题讨论】:

    标签: iphone ios navigation uitabbarcontroller tabbar


    【解决方案1】:

    您需要将第一个标签栏中的导航控制器弹出到根目录,[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];
    

    【讨论】:

      【解决方案2】:

      在您的第一个选项卡的 viewWillAppear 中,您需要弹出到根视图控制器:

      [self.navigationController popToRootViewControllerAnimated:YES];
      

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

      【讨论】:

      • 谢谢,我将它与通知一起使用,但带有 nsuserdefaults 的版本也很好用。
      猜你喜欢
      • 1970-01-01
      • 2011-09-28
      • 1970-01-01
      • 2022-01-20
      • 1970-01-01
      • 2020-01-25
      • 1970-01-01
      • 2018-06-08
      • 1970-01-01
      相关资源
      最近更新 更多