Ios Swift-保存segue后设置的ViewController
目前,我必须Ios Swift-保存segue后设置的ViewController,ios,swift,uiviewcontroller,segue,Ios,Swift,Uiviewcontroller,Segue,目前,我必须查看控制器。您可以使用show segues在ViewControllerA和ViewControllerB之间切换。问题是每次我切换回来,ViewControllers状态都会重置。如何保存视图控制器的设置 从A到B @IBAction func editButtonTapped(_ sender: Any) { let imageCollectionView = self.storyboard?.instantiateViewController(withIden
查看控制器
。您可以使用show segues
在ViewControllerA
和ViewControllerB
之间切换。问题是每次我切换回来,ViewControllers状态都会重置。如何保存视图控制器的设置
从A到B
@IBAction func editButtonTapped(_ sender: Any) {
let imageCollectionView = self.storyboard?.instantiateViewController(withIdentifier: "ImageCollectionVC") as! ImageCollectionViewController
self.navigationController?.pushViewController(imageCollectionView, animated: true)
}
从B到A
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
tappedImage = images[indexPath.row]
performSegue(withIdentifier: "backToPopUpView", sender: self)
}
您将创建新的ViewControllerA,并得到以下结果A->B->A。 但这不是真的,你应该解雇ViewControllerB
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
tappedImage = images[indexPath.row]
self.dismiss(animated: true, completion: nil)
//performSegue(withIdentifier: "backToPopUpView", sender: self)
}
要在双向传递数据的视图控制器之间移动,需要做一些事情
- 一种一致的导航方法:分段或通过导航控制器推/弹出,或通过模式呈现/取消,但不能混合使用一个a-B-a转换
- 协议/删除允许数据从子级传回父级
protocol ClassBDelegate {
func childVCDidComplete(with image: UIImage?)
}
然后在子类中创建一个委托变量,该变量可以指向采用该协议的任何类(在本例中为其父类),然后使用该委托和该协议的函数将图像数据传回。一旦数据通过代理传回,视图控制器B调用导航控制器的popViewCntroller
方法关闭自身并将焦点返回到视图控制器A
class B: UIViewController {
var delegate: ClassBDelegate?
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
tappedImage = images[indexPath.row]
delegate?.childVCDidComplete(with: tappedImage)
navigationController?.popViewController(animated: true)
}
}
要使这一切都起作用,需要将子视图控制器的委托设置为指向其父视图控制器(A),但在此之前,类需要符合协议:
extension A: ClassBDelegate {}
func childVCDidComplete( with image: UIImage?) {
self.image = image
}
}
现在,在实例化子视图控制器时,父视图控制器将自身设置为委托,从而完成通信循环
Class A: UIViewController {
var image: UIImage?
@IBAction func editButtonTapped(_ sender: Any) {
let imageCollectionView = self.storyboard?.instantiateViewController(withIdentifier: "ImageCollectionVC") as! ImageCollectionViewController
imageCollectionView.delegate = self
self.navigationController?.pushViewController(imageCollectionView, animated: true)
}
}
“问题是每次我切换回来,ViewControllers的状态都会被重置。”然后你就不会真正切换回来了。您能展示一些代码让我们知道您当前正在做什么吗?我编辑了我的问题查看您的代码您不是在视图控制器之间来回移动,而是在每次更改时创建视图控制器的新实例。所以你实际上是在做A>B>A1>B1>A2>B2等等,这就是为什么状态没有被保留。您需要弹出视图控制器B以返回A。顺便说一句,您也没有在A到B中使用segue。可能是@Flanger的副本,那么我该怎么做呢?但我正在用该segue传递一个
UIImage
。如果我只是self.discomise
那个图像没有被传递,你必须通过两种方式传递信息。1.第2号议定书。在ViewControllerB中,必须具有“parentVC:ViewControllerA”或“vcA:ViewControllerA”属性。。。在ViewControllerA中,您必须写这行imageCollectionView.vcA=self。在ViewControllerB中,您可以传递self.vcA.image=tappedimage,请详细说明一下好吗?:)我不能在viewcontrollera中编写imageCollectionView.vcA=self
,但我正努力在代码中实现这一点。。我必须在哪里实现扩展
和协议
?我已经使用A
和B
作为A和B视图控制器的简写,因此用各自的类名替换它们。然后,在导入语句和类定义之间,在其自己的文件或与视图控制器B相同的文件中实现该协议。您将视图控制器A的扩展放在它的类定义下面-在最后一个}
之后。这里的范围太广,无法解释关于协议/委托的所有内容,但是如果你在YouTube上看到Sean Allen有一个非常好的视频教程。我实现了它,但是现在如果我点击一个项目,什么都不会发生popViewController
即使它被调用也不会做任何事情,我用print
对其进行了测试,我怀疑您没有完全正确地实现它,或者您没有显示与之冲突的其他代码,因为我从一个工作模型复制了代码。什么东西什么都不做?popviewcontroller只有在您最初使用push(带导航控制器)呈现视图控制器时才起作用,而不是在您以模式呈现或使用segue时才起作用。