在iOS开发中,如果你想在两个UIViewController
之间传递数据,但又不想显示视图控制器、不连续动画效果或不更改帧,你可以使用以下几种方法:
委托是一种设计模式,允许一个对象(委托者)将某些行为委托给另一个对象(代理)。在UIViewController
之间传递数据时,可以设置一个代理协议,让接收数据的UIViewController
实现这个协议。
protocol DataTransferDelegate: AnyObject {
func didTransferData(data: Any)
}
UIViewController
:class SenderViewController: UIViewController {
weak var delegate: DataTransferDelegate?
func sendData() {
let data = "Hello, Receiver!"
delegate?.didTransferData(data: data)
}
}
UIViewController
:class ReceiverViewController: UIViewController, DataTransferDelegate {
override func viewDidLoad() {
super.viewDidLoad()
// 设置为发送者的代理
let senderVC = SenderViewController()
senderVC.delegate = self
}
func didTransferData(data: Any) {
if let stringData = data as? String {
print(stringData)
}
}
}
闭包是一种可以捕获其所在上下文中变量的匿名函数。你可以使用闭包在UIViewController
之间传递数据。
UIViewController
:class SenderViewController: UIViewController {
var dataTransferCompletion: ((Any) -> Void)?
func sendData() {
let data = "Hello, Receiver!"
dataTransferCompletion?(data)
}
}
UIViewController
:class ReceiverViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// 设置闭包
let senderVC = SenderViewController()
sender.jsdataTransferCompletion = { [weak self] data in
if let stringData = data as? String {
print(stringData)
}
}
}
}
通知是一种在应用的不同部分之间传递消息的方式。你可以使用通知在UIViewController
之间传递数据。
let DataTransferNotification = Notification.Name("DataTransferNotification")
UIViewController
:class SenderViewController: UIViewController {
func sendData() {
let data = "Hello, Receiver!"
NotificationCenter.default.post(name: DataTransferNotification, object: nil, userInfo: ["data": data])
}
}
UIViewController
:class ReceiverViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// 注册通知
NotificationCenter.default.addObserver(self, selector: #selector(handleDataTransferNotification(_:)), name: DataTransferNotification, object: nil)
}
@objc func handleDataTransferNotification(_ notification: Notification) {
if let userInfo = notification.userInfo, let data = userInfo["data"] as? String {
print(data)
}
}
deinit {
// 移除通知观察者
NotificationCenter.default.removeObserver(self, name: DataTransferNotification, object: nil)
}
}
weak
关键字来解决。UIViewController
中正确注册和移除通知观察者。通过以上方法,你可以在两个UIViewController
之间传递数据,而不需要显示视图控制器、不连续动画效果或不更改帧。
领取专属 10元无门槛券
手把手带您无忧上云