使用self.dismiss

时间:2018-05-12 12:35:43

标签: ios swift segue

我有一个视图控制器。这是一个Modal present Segue全屏视图控制器。它将图像数据列表传递给全屏视图控制器。这个列表有与之相关的属性,如喜欢,视图等。我已经看过了其他答案,但相信它们将完全取代当前的数组,我认为它将完全重新加载在第一个视图上兑现的每一位数据。所以我只想修改需要修改的数据。

Class FirstController {
    var photosList: [customStruct] = [Photo1,Photo2,Photo3] 
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "photofull" {

        if let fullImaageViewController = segue.destination as? ImageDetailViewController {
            fullImageViewController.photosList = photosList
        }
    }
}

这里数据通过Modal视图控制器传递。在完整的imageViewcontroller中,可以更改数据等。 [photosList[1].imageLikes = photosList[1].imageLikes+1

唯一的问题我只能在fullImageViewController上更改此数据,而不是在FirstController中。有没有办法在前一个访问它?

我想做一些像FirstController().[photosList[1].imageLikes = FirstController.photosList[1].imageLikes+1这样不起作用的事情。

2 个答案:

答案 0 :(得分:1)

嗯,您需要的是一个简单的委托协议,以便将数据从一个ViewController传输到另一个ViewController

以下是如何使用协议的步骤。

ViewController2 fullImaageViewController执行以下步骤。

在您的班级声明上方宣布您的代表。

protocol MyDelegate:class { // declare your protocol a class protocol
    func sendDataBack(value: Photo)
}

class中声明variable

delegate
weak var myDelegateObj: MyDelegate? // always declare a weak delegate so that it cannot capture the memory of the object

当您dismiss the VC使用行

调用委托时
myDelegateObj?.sendDataBack(value: Photo)

现在转到FirstViewController并转到您已声明FirstViewController Obj的行,如果未在viewdidloadpresenting您的观点中声明它。  并执行以下操作。

let vc = FirstViewController()
vc.myDelegateObj = self

并在FirstViewController

中实施您的委托方法

在FirstViewController中:

make your firstView conform to MyDelegate Protocol by doing:

class FirstViewController: UIViewController,MyDelegate

  

并实施MyDelegate方法

// update only altered photo
func sendDataBack(value: Photo) {
    if let index = photosList.index(where: {$0.imageID == Photo.imageID}){
        PhotoList[index] = Photo
    }
 }

然后在初始segue之前,我使用

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "photofull" {
        if let fullImaageViewController = segue.destination as? ViewController2 {
            fullImaageViewController.myDelegateObj = self
        }
    }
}

希望这有帮助。

答案 1 :(得分:0)

fullImaageViewController创建协议。并将该协议(委托)分配给FirstViewController

然后在FullImaageViewController中使用所需信息调用协议功能,以便在FirstViewController中进行必要的更新。

将邮件编辑器delegate视为功能。