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时才起作用。