iOS开发:从v2视图返回v1后如何实现数据刷新?
问题解决:修改数据后返回V1未更新的处理方案
核心问题:使用dismiss返回V1时,原有V1实例未触发数据刷新;重新实例化V1替换根控制器会破坏TabBar等原有层级结构,以下是几种可行的解决方案:
方案1:闭包回调(推荐,低耦合)
在V2中定义回调闭包,修改完成后通知V1刷新数据。
V2ViewController 修改:
class V2ViewController: UIViewController { // 定义数据更新回调 var onDataUpdated: (() -> Void)? // Firebase修改完成后调用此方法 func completeEdit() { // 这里是Firebase数据修改成功的逻辑 // ... // 触发回调通知V1 onDataUpdated?() self.dismiss(animated: true, completion: nil) } }
V1ViewController 跳转时设置闭包:
func navigateToV2() { let v2 = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "v2") as! V2ViewController // 绑定回调,执行V1的数据刷新逻辑 v2.onDataUpdated = { [weak self] in self?.reloadUserData() // 自定义方法:从Firebase重新获取并更新UI } self.present(v2, animated: true, completion: nil) }
方案2:通知中心(适合跨多页面场景)
通过通知中心发送更新通知,V1监听通知并刷新数据。
V1ViewController 添加监听:
override func viewDidLoad() { super.viewDidLoad() // 注册数据更新通知监听 NotificationCenter.default.addObserver( self, selector: #selector(reloadUserData), name: NSNotification.Name("UserDataUpdated"), object: nil ) } // 移除监听避免内存泄漏 deinit { NotificationCenter.default.removeObserver(self) } @objc func reloadUserData() { // 从Firebase重新获取姓名、性别并更新UI }
V2ViewController 发送通知:
func completeEdit() { // Firebase数据修改成功逻辑 // ... // 发送更新通知 NotificationCenter.default.post(name: NSNotification.Name("UserDataUpdated"), object: nil) self.dismiss(animated: true, completion: nil) }
方案3:代理模式(传统iOS回调方式)
定义代理协议,让V1作为V2的代理,修改完成后调用代理方法。
V2ViewController 定义协议:
protocol V2DataUpdateDelegate: AnyObject { func userDataDidUpdate() } class V2ViewController: UIViewController { weak var delegate: V2DataUpdateDelegate? func completeEdit() { // Firebase数据修改成功逻辑 // ... delegate?.userDataDidUpdate() self.dismiss(animated: true, completion: nil) } }
V1ViewController 遵守协议并设置代理:
class V1ViewController: UIViewController, V2DataUpdateDelegate { func navigateToV2() { let v2 = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "v2") as! V2ViewController v2.delegate = self self.present(v2, animated: true, completion: nil) } func userDataDidUpdate() { self.reloadUserData() } }
额外简化方案:利用viewWillAppear自动刷新
如果V1是TabBarController的子页面,dismiss返回时viewWillAppear会被触发,可直接在此方法中添加刷新逻辑:
override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) reloadUserData() // 每次页面显示时重新加载数据 }
注意:此方式会在每次返回V1时都执行刷新,可能存在不必要的网络请求,按需使用。
内容的提问来源于stack exchange,提问作者陳雅茜
相关产品推荐
相关产品推荐

