Используйте замыкание для передачи данных между двумя контроллерами - PullRequest
0 голосов
/ 28 апреля 2019

моя проблема выглядит так просто, но, поскольку я новичок, у меня есть проблема с пониманием концепции замыкания для передачи данных между двумя контроллерами

например, у меня есть контроллеры со статическим табличным представлением, которые имеют одинячейка и заголовок внутри нее

class FirstView: UITableViewController {

@IBOutlet weak var titleLabel: UILabel!

, и у меня есть еще один контроллер представления, в котором есть кнопка

class SecondViewController: UIViewController {


@IBAction func pressChangeButton(_ sender: UIButton) {

}

, и между этими двумя контроллерами есть segue1 с идентификатором "segue1""

Я хочу к простой задаче, я хочу добавить boolean замыкание, которое будет true, если нажата кнопка изменения.вот почему я создаю функцию закрытия второго контроллера представления, имеющего кнопку изменения.

var change : ((Bool) -> Void)?

Я просто хочу, чтобы контроллеры второго представления сообщали первому, что закрытие изменения теперь истинно (после нажатия изменениякнопка) и первые контроллеры представления просто изменяют таблицу заголовков внутри нее на что угодно (я просто хочу увидеть, как это можно сделать)

Я не знаю, нужно ли использовать функцию prepare sugue?Может ли кто-нибудь помочь мне понять эту концепцию?

Ответы [ 2 ]

1 голос
/ 28 апреля 2019

Закрытие - это, по сути, кусок кода, который вы можете запустить. В Swift замыкание является первоклассным гражданином, поскольку его можно передавать как параметры и возвращаемый тип функций. При этом вы можете передать или установить замыкание, как обычно, для других объектов.

Согласно ответу Ш_Кана, просто установите закрытие SecondViewController в prepare(for segue:sender:), всегда обращая особое внимание на сохранение циклов . Возможно, вы также захотите взглянуть на делегат шаблон проектирования, чтобы обмениваться данными и сообщениями между контроллерами.

1 голос
/ 28 апреля 2019

Вы можете попробовать

class FirstView: UITableViewController {

    @IBOutlet weak var titleLabel: UILabel!

    @IBAction func goToSecond(_ sender: UIButton) {

        self.performSegue(withIdentifier: "segue1", sender: nil)
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

        if segue.identifier == "segue1" {
            let des = segue.destination as! SecondViewController
            des.change = { [weak self] (value) in
                print(value)
                self?.titleLabel.text = "SetValue"// set a value
            }
        }
    }

}
class SecondViewController: UIViewController {

    var change : ((Bool) -> Void)?

    @IBAction func pressChangeButton(_ sender: UIButton) {

        change?(true)
    }

}
...