导航栏在返回到根视图控制器时未更新

3

我有一个这样设置的故事板:

  1. 导航控制器 --- 连接到 ---> 视图A ---> 表格单元格Segue ---> 视图B
  2. 独立的视图C,即,在故事板中没有任何其他视图连接到它。

当我在视图A中点击一个单元格,它会自动执行Segue到视图B。在视图B中,在显示视图并触发应用程序事件后,它会自动关闭自身并推送视图C的一个实例,就像这样:

视图B:

- (void)someEvent
{
    ViewCController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"ViewC"];
    [self.navigationController pushViewController:controller animated:YES];
}

这很好,查看 C 能正常显示。然而,当我在查看 C 的导航栏上点击“返回”按钮时,我希望它能直接回到 View A 而不是 View B。我尝试了以下代码:

View C:

- (void)viewWillDisappear:(BOOL)animated
{
     [super viewWillDisappear:animated];
     [self.navigationController popToRootViewControllerAnimated:animated];
}

这个操作几乎符合预期,因为View C被关闭了,View A再次出现,绕过了View B。问题在于,View A中的导航栏仍然认为它深层级,因为它仍然显示“返回”按钮,而不是View A中的按钮。我必须再次点击“返回”按钮才能显示正确的按钮。

我错过了什么吗?

2个回答

1
我不确定你能否做到这一点,或者你是否应该这样做。返回按钮有一个特定的目的——返回到上一个视图控制器,我认为你不应该试图破坏它(它的标题将指向那个视图控制器,而不是你的第一个视图控制器)。更好的方法是在视图C的导航栏中添加另一个条形按钮,并将其连接到执行popToRootViewController的代码。

+1 我同意。显然,第二个控制器可以设置其返回按钮(在第三个控制器上显示为“返回”按钮的按钮)以显示您想要的任何内容,但这并不改变您根本观察到的事实,即拥有一个不真正带您回到一个控制器而是两个控制器的返回按钮并不是一个很好的体验。 - Rob
我理解你的观点。但是,这取决于应用程序的上下文。比如说ViewB只是过渡性的,它执行一些设置操作或连接操作,可能成功也可能失败。如果它成功了,那么它就会将焦点转移到ViewC。一旦你完成了它,回到过渡视图就没有什么用处了。话虽如此,我想另一种方法是在返回根控制器之前使用过渡视图来清理等等。无论如何,感谢您的反馈。 - Luis Artola
@LuisArtola,如果您不希望用户返回到上一个屏幕,您可以隐藏返回按钮,只留下新添加的按钮以返回到根目录。 - rdelmar

1
在视图C中,分配自己的barButtonItem并将其放置在self.navigationItem.leftBarButtonItem中,以替换返回按钮,并使此按钮的操作执行[self.navigationController popToRootViewControllerAnimated:YES]

同意。你最终会得到一个略微奇怪的用户体验,你会看到“真正”的返回按钮滑动到新的非返回按钮形状的按钮后面,但它能够正常工作。 - Rob
谢谢,这肯定有效。唯一的注意事项是按钮不再像“返回”按钮那样,即其左侧不再是倾斜的,而是直的。 - Luis Artola
在Photoshop中制作自己的自定义箭头形状按钮 - agilityvision

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接