这似乎是一个常见的问题,但我尝试过的许多解决方案似乎都没有用(或者我没有正确执行它们)。
我在FirstImageVC上有一个图像,我按下一个按钮以显示一个带有一些自定义图像的新视图集合视图控制器,用户选择一个,我想将该图像发送回FirstImageVC以覆盖原始图像图像,有点像贴纸。
我无法让它在选择图像时执行任何类型的segue。这是我在第二个视图控制器中使用的方式。而且似乎我可能需要向原始VC添加一些东西,不是吗?
func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
prepareForSegue("backToFirstSegue", sender: self)
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "backToFirstSegue"{
let vc = (segue.destinationViewController as! FirstImageVC)
vc.Delegate = self //Include this line
vc.chosenGhostPhoto = bgGhostImage?.image
}
}
编辑1:这是我为了放松工作而做的,虽然它没有带回从集合视图中选择的图像,需要将其称为selectedGhostPhoto。
func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
performSegueWithIdentifier("unwindToFirstSegue", sender: self)
}
答案 0 :(得分:3)
您可以这样做:
第1步:在第二个视图控制器上添加delegate
变量。由于命名惯例,请将其命名为delegate
而不是Delegate
。
步骤2:定义协议并添加您希望第二个视图控制器委托执行的功能。说func selectedImage(image : UIImage)
步骤3:从第一个视图控制器推送第二个视图时,将第一个视图控制器设置为第二个视图控制器的委托。像这样:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "secondSegue"{
let vc = (segue.destinationViewController as! SecondImageVC)
vc.delegate = self
}
}
步骤4:在第二个视图控制器中选择图像后,调用第二个视图控制器的委托。需要在点击第二个视图控制器上的图像时触发以下功能。
fun imageSelected {
self.delegate.selectedImage(bgGhostImage?.image)
}
第5步:在第一个视图控制器中实施selectedImage
并使用传递的图像。
答案 1 :(得分:0)
展开segue(有时称为退出segue)可用于导航回推,模态或弹出窗口(就像您从导航栏弹出导航项,关闭弹出窗口或解除模态显示的视图控制器)。除此之外,您实际上不仅可以通过一个推送/模态/弹出窗口来展开,例如,使用单个展开操作“返回”导航层次结构中的多个步骤。
当您执行展开segue时,您需要指定一个动作,这是您想要展开的视图控制器的动作方法。
供您参考,这是一个类似的问题,可能有助于理解unwind segue