Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 使用闭包在两个控制器之间传递数据_Swift_Closures - Fatal编程技术网

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

Swift 使用闭包在两个控制器之间传递数据,swift,closures,Swift,Closures,我的问题看起来很简单,但由于我是一名初学者,我很难理解在两个控制器之间传递数据的闭包的概念 例如,我有一个静态表视图控制器,其中有一个单元格和一个标题 class FirstView: UITableViewController { @IBOutlet weak var titleLabel: UILabel! class SecondViewController: UIViewController { @IBAction func pressChangeButton(_ sender:

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

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

class FirstView: UITableViewController {

@IBOutlet weak var titleLabel: UILabel!
class SecondViewController: UIViewController {


@IBAction func pressChangeButton(_ sender: UIButton) {

}
我还有一个视图控制器,里面有一个按钮

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函数? 有人能帮我理解这个概念吗?

你可以试试

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

}
你可以试试

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

}

闭包基本上是一段可以运行的代码。在Swift中,闭包是一类公民,因为它可以作为参数和返回函数类型传递。也就是说,您可以像通常对其他对象那样传递或设置闭包


根据Shu Kan的回答,只需在
prepare(对于segue:sender:)
中设置
SecondViewController
的闭包,始终要特别注意。为了在控制器之间交换数据和消息,您可能还需要查看委托设计模式。

闭包基本上是一段可以运行的代码。在Swift中,闭包是一类公民,因为它可以作为参数和返回函数类型传递。也就是说,您可以像通常对其他对象那样传递或设置闭包

根据Shu Kan的回答,只需在
prepare(对于segue:sender:)
中设置
SecondViewController
的闭包,始终要特别注意。为了在控制器之间交换数据和消息,您可能还需要查看委托设计模式