我有一个视图控制器。这是一个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
这样不起作用的事情。
答案 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
的行,如果未在viewdidload
或presenting
您的观点中声明它。
并执行以下操作。
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
视为功能。