rundfunk47 / stinsen

Coordinators in SwiftUI. Simple, powerful and elegant.
MIT License
907 stars 95 forks source link

[Question] SplitView #8

Closed savage7 closed 3 years ago

savage7 commented 3 years ago

A SplitView is basically just a NavigationView with two root views: https://www.hackingwithswift.com/books/ios-swiftui/working-with-two-side-by-side-views-in-swiftui

I tried putting this in a NavigationCoordinatable:

@ViewBuilder func start() -> some View {
        Text("Hello, World!")
            .navigationBarTitle("Primary")

        Text("Secondary")
    }

NavigationViewCoordinatableView returns a single view, causing NavigationView not to handle the SplitView correctly.

Have you used Stinsen with a SplitView already? Is there another solution for this?

rundfunk47 commented 3 years ago

Hi! Yes, unfortunately stinsen does not support split view at the moment unless you code your own solution instead of using apple's stock version.

Why is that?

Well, it all has to do with isActive on NavigationLinks, which is the mechanism stinsen uses to create a navigation stack. Using .navigationViewStyle(StackNavigationViewStyle()) everything works as intended, if you have a navigation stack of 1 -> 2 -> 3 -> 4 the isActive will be true for 1, 2, and 3. However, removing .navigationViewStyle(StackNavigationViewStyle()) and trying again will trigger some bug in SwiftUI where the isActive will become false for some of the views, making it hard to keep track of what is shown on the screen and dismissing them correctly. This can be solved by for instance keeping track of what is being shown in i.e. onAppear and onDisappear (which was the case before if you check the git-commit history) but it makes for a very convoluted codebase and also still doesn't allow for some functions to work correctly (dismissing coordinators).

I haven't looked into this issue in a while though, perhaps it's been fixed. I'll look into it and if it's still showing up I'll submit a bug-report and add it to "known issues" in the readme ☺️

Meanwhile, if you don't need dismissal of coordinators, you can fork stinsen and remove the line that sets .navigationViewStyle(StackNavigationViewStyle()). The rest of the functions should work I think, but this is on top of my head, it was a while since I played around with trying to make this work.