触发 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
我对 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