Swift中有什么等效于RACObserve(self, presentingViewController)吗?
或其他为什么要模仿这种行为?
我的问题是,每当一个视图控制器被另一个视图控制器“隐藏”时,我都希望得到通知。在objc中,我要做的就是检查是否self.presentingViewController为nil。 请注意,在这种情况下,不知道显示了哪个视图控制器,因此不可能在其viewDidAppear/中进行通知viewDidDisappear。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在Swift中,虽然没有直接等同于ReactiveCocoa(RAC)中的RACObserve
的特性,但你可以使用Swift的属性观察器(@objc dynamic var
)或者Combine框架来达到类似的效果。下面分别介绍这两种方法:
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)
}
}
}
如果你的项目支持并倾向于使用现代的响应式编程范式,可以考虑使用Swift的Combine框架。尽管直接对presentingViewController
使用Combine可能不太直观,因为它是基于UIKit的,并非Combine原生支持的,但你可以创建一个自定义的Publisher来模拟这种行为。
请注意,直接为presentingViewController
创建Combine的Publisher并不直接且简洁,通常需要结合其他UI事件或自定义逻辑来触发发布事件。
模仿RACObserve或其他响应式编程的行为,主要是为了实现更清晰、声明式的代码风格,使得视图模型或视图控制器能够对状态变化做出即时反应,而不是分散在各个生命周期方法中处理逻辑。这种方式有助于提高代码的可读性和维护性,特别是在复杂的UI交互和状态管理场景下。