pointfreeco/swift-navigation

Should re-present when `sheet`/`fullScreenCover`/`popover` identity changes

stephencelis opened this issue · 6 comments

Our view modifier overloads currently call down to the isPresented: Binding<Bool> versions, which can lead to some unwanted behavior: for example, if a presented sheet changes to another presented sheet, this change occurs without animation (brought up in discussion #73).

We can fix this by calling down to the item: Binding<Item?> APIs instead. This means making sure that the "item" being presented is identifiable, but we can hopefully create a lightweight wrapper type to represent this info. Rather than requiring the value itself to conform to Identifiable, we can identify based off a combination of:

  • The type of value (ObjectIdentifier(Value.self)).
  • The enum case, where applicable (we can use this enumTag helper or something similar.
  • An underlying identifier by casting Value as? any Identifiable.

If anyone wants to take a shot at supporting this, we'd gladly take a PR! Otherwise we'll try to get to it soon.

Is this the cause of a .sheet being (randomly) presented as a .fullScreenCover (or vice versa) when the case of the unwrapping enum changes from one to another?

@Zeta611 It shouldn't be! That sounds like a gnarly SwiftUI bug, though, if you want to share a repro and file a feedback with Apple.

@stephencelis I think he's referring to this https://stackoverflow.com/q/69101690 which I've stumbled upon whilst using the nav branch in TCA as well, so yeah I'm pretty sure it's a vanilla SwiftUI bug.

Is there a workaround for this until this work is done?

@Muhammed9991 You should always be able to stagger the updates, e.g. nil out the presentation, sleep 0.3 seconds, and then set state to some other value.

Closed by #157.