1

我创建了一个表格视图,从那里假设用户按下了一个单元格,它将转到ListTavleView但现在唯一的问题是,每当用户在 ListTableView 中时,即使我已经嵌入了导航控制器,也没有后退按钮

我想要第一个视图导航栏是小标题第二个视图导航栏是大标题

在此处输入图像描述

下面是我的代码

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "showList" {
        if let indexPath = tableView.indexPathForSelectedRow {
            let items = dataManager.items[indexPath.row]
            let controller = (segue.destination as! UINavigationController).topViewController as! ListTableViewController
            controller.item = items
            controller.navigationItem.leftItemsSupplementBackButton = true
        }
    }
}

下面是我的故事板设置

在此处输入图像描述

没有返回按钮的导航栏

在此处输入图像描述

4

4 回答 4

3

从图像看来,视图控制器被添加为当前视图控制器中的子视图控制器。

按下单元格时不需要嵌入导航控制器,因为起点已经有导航控制器,因此无需创建新控制器。(如果您呈现视图控制器,则可能需要嵌入导航控制器。)

所以解决方案是...

  • 删除导航控制器。

在此处输入图像描述

  • 直接连接到没有导航控制器的目标视图控制器,因为已经有了。

在此处输入图像描述

于 2018-06-19T11:44:24.637 回答
1

如果您使用 pushViewController 会更好,只需获取另一个视图控制器的引用,它总是一个后退按钮,因为您正在推动抛出的导航控制器这是一个简单的示例:

let story = UIStoryboard(name: "Main", bundle: nil)
let vc = story.instantiateViewController(withIdentifier: "ExampleViewController") as! ExampleViewController
self.navigationController?.pushViewController(vc, animated: true)

至于后退按钮,问题在于您的层次结构。您是否更改了另一个视图控制器中导航栏的左侧项目,这可能会影响目标视图控制器中的导航栏。

于 2018-06-19T12:04:46.433 回答
0

如果您想在下一个视图上有导航栏后退按钮,则只需在导航上按下目标视图,它将显示默认导航后退按钮。不,需要任何额外的工作。

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "showList" {
  if let indexPath = tableView.indexPathForSelectedRow {
    let items = dataManager.items[indexPath.row]

    guard let controller = segue.destination as? ListTableViewController else {
      return
    }
    controller.item = items
    self.navigationController?.pushViewController(controller, animated: true)
  }
}}

如果您使用 segue 推送视图控制器,则无需添加以下行self.navigationController?.pushViewController(controller, animated: true)

于 2018-06-19T11:41:04.730 回答
0

您正在将新的 NavigationController(比如 Nav.B)推送到现有的 NavigationController(Nav.A)。

每个导航控制器保持不同的导航堆栈。当您将视图控制器添加到导航控制器时,后退按钮是可见的。阅读更多关于UINavigationController的信息。

对于您当前的情况,您可以删除第二个导航控制器(我认为这不是必需的)并直接连接到ListTableViewController

所以这

let controller = (segue.destination as! UINavigationController).topViewController as! ListTableViewController

变成

let controller = segue.destination as! ListTableViewController

当您需要大标题时(可用 11+),您可以在viewDidLoad()

navigationController?.navigationBar.prefersLargeTitles = true

如果它只需要这个 Viewcontroller,添加viewWillDisappear()viewDidDisappear()

navigationController?.navigationBar.prefersLargeTitles = false
于 2018-06-19T12:10:15.660 回答