这是从嵌入的视图控制器执行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
告诉其嵌入的视图控制器执行转场。创建一个名为 SegueHandler
的协议,该协议仅描述了实现方法 segueToNext(identifier: String)
的类。
protocol SegueHandler: class {
func segueToNext(identifier: String)
}
将此协议添加到 class
声明行中,使您的视图控制器实现此协议:
class ViewController: UIViewController, SegueHandler {
通过实现所需的函数来实现。
向HViewController
添加delegate
属性:
weak var delegate: SegueHandler?
在 ViewController 和 HViewController 之间点击嵌入(embed)segue箭头。在属性检查器中赋予它标识符"EmbedH"
。
通过从 ViewController 顶部的 viewController 图标 Control 拖动到 GreenViewController,创建一个show segue。在属性检查器中将此segue命名为"GoToGreen"
。
在ViewController 的prepareForSegue
中,当发生"EmbedH"
segue时,将HViewController
的delegate
属性设置为self
(即ViewController)。
当用户在HViewController
中点击H
按钮时,调用delegate?.segueToNext("GoToGreen")
以触发ViewController中的segue。
以下是模拟器演示:
我需要的正是@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
}
}