开发者社区 问答 正文

Swift是否可以观察presentingViewController中的更改?

Swift中有什么等效于RACObserve(self, presentingViewController)吗?

或其他为什么要模仿这种行为?

我的问题是,每当一个视图控制器被另一个视图控制器“隐藏”时,我都希望得到通知。在objc中,我要做的就是检查是否self.presentingViewController为nil。 请注意,在这种情况下,不知道显示了哪个视图控制器,因此不可能在其viewDidAppear/中进行通知viewDidDisappear。

展开
收起
被纵养的懒猫 2019-09-25 16:01:36 355 分享 版权
阿里云 AI 助理回答

在Swift中,虽然没有直接等同于ReactiveCocoa(RAC)中的RACObserve的特性,但你可以使用Swift的属性观察器(@objc dynamic var)或者Combine框架来达到类似的效果。下面分别介绍这两种方法:

1. 使用属性观察器

Swift提供了属性观察器,可以让你在属性值改变时得到通知。但是,对于presentingViewController这样的属性,由于它是从UIViewController继承而来的,你不能直接为其添加属性观察器。不过,你可以通过KVO(Key-Value Observing)的方式来监听这个属性的变化。首先,确保你的类遵循了NSObject协议,然后使用observe(_:options:change:context:)方法进行观察。

import UIKit

class YourViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // 添加KVO观察
        addObserver(self, forKeyPath: "presentingViewController", options: [.new, .old], context: nil)
    }
    
    deinit {
        // 记得在deinit中移除观察者,避免内存泄漏
        removeObserver(self, forKeyPath: "presentingViewController")
    }
    
    override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
        if keyPath == "presentingViewController" {
            if let newValue = change?[.newKey] as? UIViewController, newValue == nil {
                // presentingViewController变为nil,即视图控制器被dismiss
                print("Presenting view controller dismissed.")
            }
        } else {
            super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context)
        }
    }
}

2. 使用Combine框架

如果你的项目支持并倾向于使用现代的响应式编程范式,可以考虑使用Swift的Combine框架。尽管直接对presentingViewController使用Combine可能不太直观,因为它是基于UIKit的,并非Combine原生支持的,但你可以创建一个自定义的Publisher来模拟这种行为。

请注意,直接为presentingViewController创建Combine的Publisher并不直接且简洁,通常需要结合其他UI事件或自定义逻辑来触发发布事件。

为什么模仿这种行为?

模仿RACObserve或其他响应式编程的行为,主要是为了实现更清晰、声明式的代码风格,使得视图模型或视图控制器能够对状态变化做出即时反应,而不是分散在各个生命周期方法中处理逻辑。这种方式有助于提高代码的可读性和维护性,特别是在复杂的UI交互和状态管理场景下。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答分类:
问答地址: