I have an NSManagedObject with NSManaged properties that control the expanded/collapsed state of disclosure groups. Here's an example:
/// Views that provides UI for app settings.
struct SettingsView: View {
@Binding var isExpanded: Bool
var body: some View {
let _ = Self._printChanges()
DisclosureGroup(isExpanded: $isExpanded, content: {
VStack {
Text("Hello world!")
Text("Hello world!")
Text("Hello world!")
Text("Hello world!")
Text("Hello world!")
}
}, label: {
HStack {
Text("Settings")
}
})
.padding([.leading,.trailing])
}
}
The view's parent calls it like this:
@EnvironmentObject var settings: SideBarSettings
.
.
.
SettingsView(isExpanded: $settings.isExpanded)
The disclosure group animation is lost when using NSManaged property. Animation is preserved when using any other non-NSManaged property even if the property is declared inside NSManagedObject.
Why is DisclosureGroup animation lost when using the NSManaged property?
After spending a few days on this, I'm accepting that the underlying problem is the way NSManaged properties work with SwiftUI. So, a possible solution would be to not use the NSManaged property at all in the DisclosureGroup and use a value type instead.
And use modifiers to init it and track changes on the new State var; like this:
Not elegant, nor scalable ... but it works.
Open to better solutions!
Update: With a little help from this post, came up with a CustomDisclosureGroup that eliminates lots of code duplication.