触发 Show Detail Segue 后缺少 Master View Controller Bar Button

MasterViewController BarButton missing after Show Detail Segue is triggered

我对 Swift 还是很陌生,正在做一些个人项目来帮助我理解事物。

现在,我正在使用主从应用程序作为模板。在MasterViewController上,是动态TableViewController。

我想要实现的是,当我点击任何一个单元格时,MasterViewController 将显示另一个导航列表(我已经使用 Push segue 设法做到了这一点),然后继续DetailViewController,而不是调用 DetailViewController,它当前正在调用 ContentsViewController,这是一个带有 TabBar 的 ViewController(我也使用 Ctrl Click 将其连接起来在 Cell 上并使用 Accessory Action -> Show ).

触发 segue 的源代码片段

MasterViewController.swift

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "showContentDetailSegue" {
        if let indexPath = self.tableView.indexPathForSelectedRow() {
            performSegueWithIdentifier ("ContentDetailSegue", sender: self)
        }
    }
}

现在,内容ViewController 可以正常显示。但是,左上角的BarButton不再有切换Master的Master BarButtonViewController.

我也试过 self.presentViewController 但它会替换整个屏幕,这不是我想要的,因为我想保持 Split View 的完整性。

我哪里做错了?感谢任何帮助。

终于,我看到了你的代码。顺便说一句,今天我不得不升级到 Xcode 6.3,所以我也不得不将你的代码更改为 Swift 1.2(变化不大)。

因此,您的第一个目标是使 DetailsViewController 成为 UITabbar。问题是项目的情节提要没有反映这个意图。事实上,SplitVC 的第二行不会转到 Tabbar 控制器,但它应该。以下是更正后的故事板。

第二个问题在prepareForSegue。您正在第一个过渡中开始第二个过渡,事实证明这是正确的。但是,您还需要处理第二个 segue,以便添加 < Back 按钮:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

    if segue.identifier == "showDetail" {
       ...
      // start second segue
      performSegueWithIdentifier ("ContentDetailSegue", sender: self)


    } else if segue.identifier == "ContentDetailSegue" {
      // add back button
    }
}

添加后退按钮有点棘手。由于目的地 VC 尚未加载,您 不能 将后退按钮添加到其导航栏。它根本不存在(它将在 class 的 viewDidLoad() 方法中可用)。

因此,我们将在成员变量中保存指向后退按钮的指针,如下所示:

detailsViewController.leftButton = self.splitViewController?.displayModeButtonItem()

并将其安装在 viewDidLoad:

override func viewDidLoad() {
    super.viewDidLoad()

    if let button = leftButton {
        navigationItem.leftBarButtonItem = button
    }
}

通过这些修复,一切正常。可以找到修改后的代码here

好的,在尝试单击其他选项卡时发现了另一个问题,在我单击第一个选项卡之前,左上角的大师将出现错误。

为了解决这个问题,我使用了 http://nshipster.com/uisplitviewcontroller/

中的建议

在与故事板 xyzViewController

连接的相应 swift 文件中包含以下代码
navigationItem.leftBarButtonItem = splitViewController?.displayModeButtonItem()
navigationItem.leftItemsSupplementBackButton = true