如何从堆栈顶部的UINavigationController获取对UINavigationController的backBarButtonItem的引用。在某些情况下,我想禁用返回,直到某些网络代码完成。
self.parentViewController.navigationItem.backBarButtonItem.target = self;
self.parentViewController.navigationItem.backBarButtonItem.action = @sel...;
不起作用 委托方法
- (BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPopItem:(UINavigationItem *)item
也不起作用。
答案 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控制器中,这样就可以了。
在这种情况下,您可能不需要担心后退按钮,因为它不再存在!
祝你好运希望这有帮助。