触发Show Detail Segue后,MasterViewController BarButton丢失

时间:2015-04-07 06:24:40

标签: swift uisplitviewcontroller master-detail

我仍然对Swift很陌生,并做了一些个人项目来帮助我理解事物。

现在,我使用Master-Detail应用程序作为模板。在MasterViewController上,它是一个动态的TableViewController。

我想要实现的是当我点击任何单元格时,MasterViewController将显示另一个导航列表(我已经设法使用Push segue),并且在DetailViewController上,而不是调用DetailViewController,它当前正在调用ContentsViewController,这是一个带有TabBar的ViewController(我也使用Ctrl单击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)
        }
    }
}

现在,ContentsViewController没有显示问题。但是,左上角的BarButton不再具有切换MasterViewController的Master BarButton。

我也尝试过self.presentViewController,但它会取代整个屏幕,这不是我想到的,因为我想保持拆分视图完好无损。

我哪里出错了?任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:1)

最后,我对您的代码进行了更改。顺便说一句,今天我不得不升级到Xcode 6.3,所以我还必须将你的代码更改为Swift 1.2(没有太大的改动)。

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

storyboard

第二个问题出在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尚未加载,因此无法向其导航栏添加按钮。它根本就不存在(它将在该类的viewDidLoad()方法中提供)。

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

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

并将其安装在viewDidLoad

override func viewDidLoad() {
    super.viewDidLoad()

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

通过这些修复,一切都很完美。您可以找到修改后的代码here

答案 1 :(得分:0)

好的,在尝试点击其他标签时发现了另一个问题,左上角的主人将会出错,直到我点击第一个标签。

要解决此问题,我使用了http://nshipster.com/uisplitviewcontroller/

中建议的内容

在与故事板xyzViewController连接的相应swift文件中包含以下代码

navigationItem.leftBarButtonItem = splitViewController?.displayModeButtonItem()
navigationItem.leftItemsSupplementBackButton = true