Передайте переменную другому контроллеру вида с помощью кнопки назад - PullRequest
0 голосов
/ 05 марта 2019

У меня есть два контроллера представления.К одному обращаются с "шоу" segue.В UINavigationBar есть кнопка возврата, которую я не менял.Кнопка «Назад» возвращает к контроллеру начального вида.В контроллере вида с кнопкой «назад» я сохраняю данные в переменной.

Как передать эти данные в мой начальный контроллер вида?

Я пытался:

viewWillDisappear(_ animated: Bool) {
    let vc = ViewController()
    vc.data = items
}

но данные в контроллере начального представления при печати пустые.

Я пытался использовать:

prepare(for segue: ...)

, но я не уверен, что вызывает кнопка возвратаиспользует.

Кажется, я не могу добавить действие кнопки «Назад» в мой контроллер вида.

Ответы [ 2 ]

1 голос
/ 05 марта 2019

vc не тот контроллер, к которому вы возвращаетесь.


Создайте переменную замыкания во втором контроллере с массивом ваших моделей в качестве параметра

class SecondViewController: UIViewController {
    var callback: (([Item]) -> Void)?
}

затем в prepare(for:sender:) первого контроллера назначьте callback пункта назначения и объявите, что вы хотите изменить data первого контроллера, когда вызывается callback

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "yourSegueIdentifier" {
        let destinationVC = segue.destination as! SecondViewController
        destinationVC.callback = { items in
            self.data = items
        }
    }
}

Затем, когда вам нужно (означает ввызов viewWillDisappear) второго контроллера callback с заданными пунктами

override func viewWillDisappear(_ animated: Bool) {
    callback?(items)
}
0 голосов
/ 05 марта 2019

Вы можете использовать делегата. Сначала создайте протокол:

protocol getItemsDelegate {
    func getItems(_ items: [String])
}

В определении класса вашего первого контроллера взгляда добавьте getItemsDelegate:

class myFirstViewController: UIViewController,getItemsDelegate

Добавьте это в метод prepare в вашем первом контроллере представления:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    let vc = segue.destination as! mySecondViewController
    vc.delegate = self
}

Наконец, в вашем первом контроллере представления добавьте:

func getItems(_ items: [String]) {
    // Do something with items
}

В вашем втором контроллере представления объявите следующее свойство:

var delegate: getItemsDelegate?

Тогда:

override func viewWillDisappear(_ animated: Bool) {
   delegate?.getItems(items)
}

Это просто еще один способ сделать это.

...