使用闭包在两个控制器之间传递数据

时间:2019-04-28 15:29:19

标签: swift closures

我的问题看起来很简单,但是由于我是初学者,所以我在理解闭包的概念上存在问题,闭包的概念是在两个控制器之间传递数据

例如,我有一个静态表视图控制器,其中有一个单元格和一个标题

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 个答案:

答案 0 :(得分:1)

您可以尝试

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)
    }

}

答案 1 :(得分:1)

闭包基本上是可以运行的一段代码。在Swift中,闭包是一等公民,因为它可以作为参数和函数的返回类型来传递。话虽如此,您可以像平常一样对其他对象进行传递或设置闭包。

根据Sh_Kan的回答,只需在SecondViewController中设置prepare(for segue:sender:)的闭包,请务必特别注意retain cycles。您可能还想看看委托设计模式,以便在控制器之间交换数据和消息。