iOS 开发之swift 如何写一个block用于页面a给页面b传值,并页面b会给页面a反馈结果

189 阅读2分钟

在iOS开发中,使用Swift编写Block(闭包)来实现页面A向页面B传值,并且页面B再向页面A反馈结果,可以按照以下步骤进行:

1. 在页面B中定义闭包

首先,在页面B的控制器中定义一个闭包,并将其作为属性。这个闭包将用于接收页面A传递的数据,并在页面B中处理完数据后,将结果回调给页面A。

// SecondViewController.swift

import UIKit

class SecondViewController: UIViewController {

// 定义一个闭包类型

typealias CompletionHandler = (String) -> Void

// 声明一个闭包属性

var completionHandler: CompletionHandler?

// 假设有一个按钮点击事件,用于触发闭包回调

@IBAction func confirmButtonTapped(_ sender: UIButton) {

// 假设这里有一个文本框,用户输入了数据

let userInput = "用户输入的数据"

// 调用闭包并传递数据

completionHandler?(userInput)

// 关闭当前页面

dismiss(animated: true, completion: nil)

}

}

2. 在页面A中设置闭包

在页面A中,当跳转到页面B时,设置页面B的闭包属性。这样,当页面B完成操作后,可以通过闭包将结果回调给页面A。

// FirstViewController.swift

import UIKit

class FirstViewController: UIViewController {

@IBOutlet weak var resultLabel: UILabel!

@IBAction func showSecondViewController(_ sender: UIButton) {

// 创建页面B的实例

let secondVC = SecondViewController()

// 设置页面B的闭包属性

secondVC.completionHandler = { [weak self] result in

// 在这里处理从页面B传回的数据

self?.resultLabel.text = result

}

// 以模态方式展示页面B

present(secondVC, animated: true, completion: nil)

}

}

3. 处理闭包回调

在上面的代码中,当用户在页面B点击确认按钮时,会触发confirmButtonTapped方法。在这个方法中,会调用之前设置的闭包,并将用户输入的数据作为参数传递给闭包。页面A中的闭包实现会在接收到数据后,更新resultLabel的文本内容。

注意事项

  • 循环引用:在设置闭包时,使用[weak self]来避免循环引用问题。这样可以确保当页面A被释放时,闭包不会继续持有页面A的强引用,从而导致内存泄漏。
  • 可选链:在调用闭包时,使用可选链(?)来确保闭包已经被正确设置。如果闭包没有被设置,调用时不会引发崩溃。

通过以上步骤,可以实现页面A向页面B传值,并且页面B再向页面A反馈结果的功能。这种方式简洁且易于理解,是iOS开发中常用的数据传递方法之一。