我仍然对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,但它会取代整个屏幕,这不是我想到的,因为我想保持拆分视图完好无损。
我哪里出错了?任何帮助表示赞赏。
答案 0 :(得分:1)
最后,我对您的代码进行了更改。顺便说一句,今天我不得不升级到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尚未加载,因此无法向其导航栏添加按钮。它根本就不存在(它将在该类的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