上下文
我有一个非常简单的Form
,使用MVVM
架构。但是,我在这个实现中遇到了一个问题。我的DetailView
有一个DummyState
,它改变了Entity
onChange
的相应属性。
**问题:**一旦DetailView
出现,Toggles
都在,这是预期的。然而,当关闭本地Toggle
时,另一个Toggle
仍保持打开状态,这是意料之外的。然而,只要我与另一个元素(不在MRE
中)交互,第二个Toggle
似乎刷新并关闭。
编码
@objc(Entity) public class Entity: NSManagedObject {
@NSManaged public var enabled: Bool
}
class FormViewModel: ObservableObject, CustomFormObservable {
@Published var entity = Entity(context: ...)
init() { self.entity.enabled = true }
var isValid: Bool { self.entity.enabled }
}
struct FormView: View {
@StateObject private var formVM = FormViewModel()
var body: some View {
CustomForm(formVM: formVM) {
DetailView(entity: $formVM.entity)
}
}
}
struct DetailView: View {
@Binding var entity: Entity
@State private var localEnabled: Bool = true
var body: some View {
Toggle("Local Toggle", isOn: $localEnabled)
.onChange(of: localEnabled) { entity.enabled = $0 }
Toggle("Toggle", isOn: $entity.enabled)
}
}
问题
- 是什么导致了这种行为,我该如何解决它?
1条答案
按热度按时间xtfmy6hx1#
因为
NSManagedObject
是引用类型。有一个简单的规则:
@State
和@Binding
是用于像结构这样的值类型。@StateObject
和@ObservedObject
用于类等引用类型。而且 * 美元符号引用 * 也只适用于值类型。
幸运的是,
NSManagedObject
默认符合ObservableObject
。