1

在此处输入图像描述 如何从堆栈顶部的 UINavigationController 获取对 UINavigationController 的 backBarButtonItem 的引用。在某些情况下,我想禁用返回,直到某些网络代码完成。

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

委托方法不起作用

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

也不行。

4

1 回答 1

1

一个答案和一个建议:

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

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

我测试了它并且它有效。

建议:从不建议将 UITabBarController 放在 UINavigationController 中(仅推荐相反)。在您深入了解您的项目之前,我会做出相应的调整。

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

1-我会删除第一个 NavController

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

3- 断开主 VC 与 TabBar 控制器的连接(删除该链接),因为如果没有导航控制器,您将无法在 SB 中使用 segues。您将必须实例化并呈现该选项卡栏控制器。

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 嵌入到导航控制器中,这样就可以了。

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

祝你好运

希望这可以帮助。

于 2013-03-03T23:10:00.693 回答