在堆栈顶部访问UINavigationController

时间:2013-03-03 16:16:52

标签: iphone uinavigationcontroller uitabbarcontroller storyboard uinavigationitem

enter image description here 如何从堆栈顶部的UINavigationController获取对UINavigationController的backBarButtonItem的引用。在某些情况下,我想禁用返回,直到某些网络代码完成。

  

self.parentViewController.navigationItem.backBarButtonItem.target = self;   self.parentViewController.navigationItem.backBarButtonItem.action = @sel...;

不起作用 委托方法

  

- (BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPopItem:(UINavigationItem *)item

也不起作用。

1 个答案:

答案 0 :(得分:1)

答案和建议:

答案:我建议您稍微更改MVC模型,使模型中的BOOL属性打开或关闭,具体取决于网络活动是否已完成,然后使用您更新的QuestionsVC采用的委托/协议后退按钮设置为该属性更改。您需要在QuestionsVC的委托方法中添加以下内容:

[self.tabBarController.navigationItem setHidesBackButton:YES animated:YES];

我测试了它并且有效。

建议:永远不建议在UINavigationController中使用UITabBarController(建议只使用反转)。在您深入了解项目之前,我会相应地进行调整。

更新: 我可以理解需要一个mainVC作为启动VC,并带有一个按钮来启动"如果你愿意的话。你是正确的,你需要一个NavController能够推送/弹出VC并在Storyboard中使用segue。但这不是显示VC序列的唯一方法,您可以提供/解除VC。所以在你的情况下:

1-我会删除第一个NavController

2-通过将NavController左侧的箭头移动到MainVC的左侧,使MainVC成为起始VC(入口点)

3-从TabBar控制器断开主VC(删除该链接),因为如果没有Nav Controller,您将无法在SB中使用segue。您必须实例化并显示该选项卡控制器。

4-添加一个新的目标文件(.m / .h) - UITabBarController的子类,并将IB中tabBarController的类更改为子类的名称。如果没有在IB中的类列表的下拉列表中显示,则可能必须构建/清理或重新启动xcode。

5-在mainVC中创建一个IBAction方法,并将其链接到Main VC中的按钮。

6-在该方法中(在主VC中),添加以下代码:

yourTabBarControllerSubClassName*  myTabController= [self.storyboard instantiateViewControllerWithIdentifier:@"theTab"];
[self presentViewController:myTabController animated:YES completion:nil];

7-确保在SB中选择标签栏控制器并在身份检查器中,将SB ID设置为" theTab"并检查"使用SB ID"。

8-如果问题VC或状态表VC在每个VC中都有一系列VC,您可以将每个VC嵌入到Nav控制器中,这样就可以了。

在这种情况下,您可能不需要担心后退按钮,因为它不再存在!

祝你好运

希望这有帮助。