изменение существующих данных в viewcontroller между контроллерами представления с помощью self.dismiss - PullRequest
0 голосов
/ 12 мая 2018

У меня есть контроллер вида. Это делает 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 данные, такие как like, могут быть изменены. [photosList[1].imageLikes = photosList[1].imageLikes+1

Единственная проблема, которую я могу изменить только эти данные на fullImageViewController, а не в FirstController. Есть ли способ получить доступ к нему на предыдущем тоже?

Я хотел бы сделать что-то вроде FirstController().[photosList[1].imageLikes = FirstController.photosList[1].imageLikes+1, которое не работает.

Ответы [ 2 ]

0 голосов
/ 12 мая 2018

Ну, здесь вам нужен простой протокол делегата для передачи данных из одного 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
    }
 }

А потом, перед начальным переходом, я использую

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

Надеюсь, это поможет.

0 голосов
/ 12 мая 2018

На вашем fullImaageViewController создайте протокол.И назначьте этот протокол (делегат) на FirstViewController.

. Затем вызовите функцию протокола в FullImaageViewController с необходимой информацией, чтобы выполнить необходимое обновление в FirstViewController.

Думаю, композитор почты delegate функций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...