ios - 对事件做出反应(而不是陈述!)
问题描述
我有一个观察模型(postModel)的视图:
struct PostView: View {
@ObservedObject var postModel: PostModel
@State var description: String = ""
}
class PostModel: ObservableObject {
@Published var step: Step = .first
enum Step {
case first
case second
case third
}
}
现在我想将状态变量设置为何时从 to 更改description
,但不是如果它从to更改。我怎样才能做到这一点?""
step
.third
.first
.second
.first
解决方案
@Published
属性包装器已经为您提供了一个Published.Publisher
, 可通过$
前缀访问,该前缀将在值更改时发布。
您可以订阅它以设置description
属性,但您必须将整个逻辑移动到 ObservableObject 视图模型中,因为您不能改变视图。
您将在订阅中收到的值将是 step 属性将设置为的值 - 就在属性值实际更改之前,因此您可以将订阅中的新值与属性的现有值进行比较。
class PostModel: ObservableObject {
@Published var step: Step = .first
@Published var description: String = ""
private var cancellables = Set<AnyCancellable>()
init() {
self.$step.sink { nextStep in
if nextStep == .first && self.step == .third {
self.description = ""
}
}.store(in: &cancellables)
}
enum Step { case first, second, third }
}
struct PostView: View {
@ObservedObject var postModel: PostModel
var body: some Body {
Text(postModel.description)
}
}
为了完整起见,另一种方法(如果您不想移动description
到视图模型中)是创建一个发布者,该发布者仅在从.third
to切换时发出一个值.first
,然后.onReceive
在 View 中订阅它以设置description
:
class PostModel: ObservableObject {
@Published var step: Step = .first
var newCycle: AnyPublisher<(), Never> {
$step.compactMap { $0 == .first && self.step == .third ? () : nil }
.eraseToAnyPublisher()
}
enum Step { case first, second, third }
}
然后,在PostView
:
struct PostView: View {
@ObservedObject var postModel: PostModel
@State var description: String = ""
var body: some Body {
VStack() {
Text(description)
}
.onReceive(postModel.newCycle) {
self.description = ""
}
}
}
推荐阅读
- javascript - 使用 React-Table 选择多行?(Shift + 单击)
- c# - 如何从 C# 运行 nodejs 包
- sql-server - 在事务 SQL 中删除某个列之后的其余列
- react-native - React-native + apollo:网络请求失败
- php - PHP 如何在 Firebase 的表中添加/插入表
- python - Jupyter notebook 找不到模块
- python - 使用 conda 安装 CUDA 驱动程序后的 libcuda.so.1
- angular - Ionic 3 - firebase 插件 - 无法获取手机的令牌
- c++ - VSC 将默认编译器设置为 clang++ -std=c++17 或 g++ -std=c++17
- maven - ClassNotFoundException org.hornetq.jms.client.HornetQTopic