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(…)
。这完全取决于你的应用程序有多复杂/灵活。