Swift3 如何在Swift 3中使用展开(适用于:UIStoryboardSegue、TowardsView控制器:UIViewController)?

Swift3 如何在Swift 3中使用展开(适用于:UIStoryboardSegue、TowardsView控制器:UIViewController)?,swift3,ios10,uistoryboardsegue,unwind-segue,Swift3,Ios10,Uistoryboardsegue,Unwind Segue,我使用苹果的示例代码。 最初的方法是这样的 @IBAction func doneTapped() { favoriteCreatureDidChange?(favoriteCreature) dismiss(animated: true, completion: nil) } 我将Segue的种类从现在的Modally改为Show(例如Push)。因此,解雇不再有效,我需要使用Unwind Segue来访问我以前的VC 在SourceVC中不能声明iAction,因为我需要执

我使用苹果的示例代码。 最初的方法是这样的

@IBAction func doneTapped() {
    favoriteCreatureDidChange?(favoriteCreature)
    dismiss(animated: true, completion: nil)
}
我将Segue的种类从现在的Modally改为Show(例如Push)。因此,解雇不再有效,我需要使用Unwind Segue来访问我以前的VC

在SourceVC中不能声明iAction,因为我需要执行
favoriteCreatureDidChange?(FavoriteCreacture)
-变量,该变量在我当前所在的VC中声明

我想我需要使用
展开(对于:UIStoryboardSegue、towardsViewController:UIViewController)

正如我对
for:
参数的理解,我需要使用一个在当前VC中传输的序列

我正在试着得到segue的实例

let segue = UIStoryboardSegue(identifier: "showFavoriteCreaturePicker", source: DreamListViewController, destination: FavoriteCreatureListViewController)
但Xcode抱怨
无法将“DreamListViewController.type”类型的值转换为预期的参数类型“UIViewController”
虽然FavoriteCreatureListViewController一切正常


请让我知道如何将segue传递到
for:
参数而不出错。

此初始值设定项需要控制器实例,而不是控制器类型。但是,请注意以下内容:

您不直接创建segue对象。相反,故事板 当运行时必须在两个视图之间执行切换时,它会创建它们 控制器。您仍然可以使用 表演​Segue(带​标识符:​发件人:​) UIView方法​控制器 如果你愿意的话。你可以这样做,从一个 以编程方式添加,因此在接口中不可用 建筑商

此外,您仅在自定义序列中使用此初始值设定项:

如果需要初始化自定义segue子类中的任何变量, 您还可以重写init(标识符:​资料来源:​目的地:​) 方法并在自定义实现中初始化它们

对于
展开(对于:​朝着​看法​控制器:​),这样说(强调我的):

在执行展开序列期间,UIKit在 展开路径中的任何视图控制器,使其有机会 重新配置自身。容器视图控制器必须实现此功能 方法并用于在后续视图中显示视图控制器​风险投资 参数。例如,选项卡栏控制器选择选项卡 包含指定的视图控制器。非容器视图 控制器不应重写此方法

最后,解决方案是:您可以在Interface Builder中创建一个展开序列,并在启动展开的视图控制器中覆盖prepare(for:sender:):

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    super.prepare(for: segue, sender: sender)
    favoriteCreatureDidChange?(favoriteCreature)
}
这将在调用展开序列的目标视图控制器中的展开操作之前调用


还请注意,
UINavigationController

中有一个解决方案,非常感谢。它成功了。我还想补充一点,为了能够在Interface Builder中创建一个展开序列,您需要在要返回的控制器中添加一个展开方法(IBAction)。因为我有两个按钮(完成并取消)。我稍微修改了这个方法:
重写func prepare(对于segue:UIStoryboardSegue,sender:Any?{super.prepare(对于:segue,sender:sender)让button=sender as!UIBarButtonItem if button.style=.done{FavoriteCreaturedChange?(FavoriteBearture)}
如果没有
按钮,您认为有什么更好的方法可以做到这一点。style
和downcasting sender to the UIBarButtonim?我使用的经典方法是有两个展开操作,并在Interface Builder中为这两个展开序列(完成和取消按钮各一个)提供标识符(例如“UnwindToDoneSegue”和“UnwindToCancelSegue”)并在
准备(发件人:)
中检查此标识符(使用
序列标识符
)。事实上,我养成了一个习惯,总是检查标识符,以防以后添加更多的分段,但为了简洁起见,我忽略了这一点。虽然在您的情况下,这可能会有些过分,您可以使用问题中显示的原始设置,调用
popViewController(…)
而不是
Discover(…)
。这完全取决于你的应用程序有多复杂/灵活。