0

我正在使用一个 NavigationController,它的第一个视图控制器是一个没有任何 UI 的“决策者”类。因此,以它为根,检查本地数据库,如果我们有某些项目,决策者 VC 将推送某个 VC,或者如果没有项目,它将推送另一个 VC。所以它真的就像一棵有 2 个树枝的树。

在分支 1 的某个时刻,我们有一些 VC 被推入堆栈,用户可能会删除他们的最后一个“项目”,所以我想调用 popToRootViewControllerAnimated 并让我的决策者正确路由到分支 2。一切正常,除了在导航栏中,我无法摆脱分支 2 上第一个 VC 中的后退按钮,其中包含分支 1 中最后一个 VC 的标题。

这是图表导航(有点):

NavController
DecisionMaker
   branch1VC1
      branch1VC2
         branch1VC3
   branch2VC1
      branch2VC2

如果我们在 branch1VC3 并且我删除最后一个项目然后调用 popToRootViewControllerAnimated,它会通过 DecisionMaker 并正确降落在 branch2VC1,但它有一个带有标签“branch1VC3”的后退按钮。当你按下按钮时,它不会做任何事情。我还注意到,当我单击底部导航栏中的另一个按钮(将您带到“关于页面”)时,我会在“关于”页面顶部看到的正常后退按钮不存在,所以我无法返回。基本上,导航被这一点搞砸了。

我试过了:

  • 在目标 VC (branch2VC1) 中调用 self.navigationItem.hidesBackButton = YES 但它不起作用。
  • 调用 self.navigationItem.backBarButtonItem = NULL 相同。
  • 调用 self.navigationItem.leftBarButtonItem = NULL 相同(所有这些都在 viewDidLoad 和 viewWillAppear 中尝试过)
  • 在 DecisionMaker VC 中将 self.title 设置为 null。这只是将后退按钮内的文本转换为“后退”的效果,但一旦完成导航到 VC,它仍然存在。
  • 调试以查看我认为在堆栈上的 VC 肯定是,即在 DecisionMaker VC 内部只有 1 个(本身),在 branch2VC1 内部有 2 个。

基本上,对我来说,问题似乎可能是 pop to root 操作与新推送到另一个分支的 UI 周期相同。但我不明白为什么这不可行。我发现这个 SE 问题我认为可能是相同的,但实际上并没有任何答案。

编辑: 解决方案是在执行我的任何自定义逻辑和导航之前在 DecisionMaker VC 上调用 super.viewWillAppear。

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    [self decideViewController];
}
4

1 回答 1

0

如果视图层次结构被推入viewWillAppear,或者在新 UI 正确加载之前的某个地方,它们几乎总是会出现问题。确保在正确的时间推送新视图。

于 2013-01-02T09:03:38.303 回答