我想从" H"中的视图容器中删除。使用连接到Split View Controller的导航控制器显示。我怎么能做到这一点?我已经使用本地链接的故事板ID尝试了常规的performSegueWithIdentifier,但删除了顶部导航栏。我想保留顶部导航栏并执行segue,就像使用主导航控制器完成一样(选择在详细视图中显示哪个视图控制器的行)。
非常感谢任何帮助!
答案 0 :(得分:8)
以下是如何从嵌入式ViewController执行segue的示例。
<强> ViewController.swift 强>
import UIKit
protocol SegueHandler: class {
func segueToNext(identifier: String)
}
class ViewController: UIViewController, SegueHandler {
func segueToNext(identifier: String) {
self.performSegueWithIdentifier(identifier, sender: self)
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "EmbedH" {
let dvc = segue.destinationViewController as! HViewController
dvc.delegate = self
}
}
}
<强> HViewController.swift 强>
import UIKit
class HViewController: UIViewController {
weak var delegate: SegueHandler?
@IBAction func pressH(sender: UIButton) {
delegate?.segueToNext("GoToGreen")
}
}
<强>设定:强>
HViewController
告诉其嵌入的viewController执行segue。创建一个名为SegueHandler
的协议,该协议仅描述实现方法segueToNext(identifier: String)
的类。
protocol SegueHandler: class {
func segueToNext(identifier: String)
}
让viewController通过将其添加到class
声明行来实现此协议:
class ViewController: UIViewController, SegueHandler {
并实施所需的功能。
将delegate
属性添加到HViewController
:
weak var delegate: SegueHandler?
单击ViewController和HViewController之间的embed segue箭头。在属性检查器中为其指定标识"EmbedH"
。
通过 Control 从ViewController顶部的viewController图标拖动到GreenViewController,在ViewController和GreenViewController之间创建 show segue。在属性检查器中为此segue "GoToGreen"
命名。
在ViewController的prepareForSegue
中,当发生"EmbedH"
segue时,将delegate
的{{1}}属性设置为HViewController
(ViewController)。< / p>
当用户点击self
中的H
按钮时,请致电HViewController
以触发ViewController中的segue。
这是在模拟器中运行的:
答案 1 :(得分:0)
我确实需要@vacawama在这里提出的内容,虽然我无法重现这一点,但我完全尝试了你的步骤,但self.delegate?.segueToNext("GoToGreen")
被调用了,但协议本身和容器视图控制器都没有。经过一整天的搜索,我意识到问题出在swift版本上。只需替换它:
func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "EmbedH" {
let dvc = segue.destination as! HViewController
dvc.delegate = self
}
}
为此:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "EmbedH" {
let dvc = segue.destination as! HViewController
dvc.delegate = self
}
}
我遗漏的其他细节是关于嵌入式segue。一定要将容器View连接到HViewController,而不是View Controller本身,否则不会出现segue的Embed选项。