如何在导航控制器显示的视图中从容器视图执行segue?

时间:2016-06-01 14:10:15

标签: ios xcode swift

Storyboard

我想从" H"中的视图容器中删除。使用连接到Split View Controller的导航控制器显示。我怎么能做到这一点?我已经使用本地链接的故事板ID尝试了常规的performSegueWithIdentifier,但删除了顶部导航栏。我想保留顶部导航栏并执行segue,就像使用主导航控制器完成一样(选择在详细视图中显示哪个视图控制器的行)。

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:8)

以下是如何从嵌入式ViewController执行segue的示例。

Sample Storyboard

<强> 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")
    }

}

<强>设定:

  1. 使用委托让HViewController告诉其嵌入的viewController执行segue。
  2. 创建一个名为SegueHandler的协议,该协议仅描述实现方法segueToNext(identifier: String)的类。

    protocol SegueHandler: class {
        func segueToNext(identifier: String)
    }
    
  3. 让viewController通过将其添加到class声明行来实现此协议:

    class ViewController: UIViewController, SegueHandler {
    

    并实施所需的功能。

  4. delegate属性添加到HViewController

    weak var delegate: SegueHandler?
    
  5. 单击ViewController和HViewController之间的embed segue箭头。在属性检查器中为其指定标识"EmbedH"

  6. 通过 Control 从ViewController顶部的viewController图标拖动到GreenViewController,在ViewController和GreenViewController之间创建 show segue。在属性检查器中为此segue "GoToGreen"命名。

  7. 在ViewController的prepareForSegue中,当发生"EmbedH" segue时,将delegate的{​​{1}}属性设置为HViewController(ViewController)。< / p>

  8. 当用户点击self中的H按钮时,请致电HViewController以触发ViewController中的segue。

  9. 这是在模拟器中运行的:

    Simulator Demonstration

答案 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选项。