SwiftUI Navigation с выдвижным меню - PullRequest
0 голосов
/ 31 октября 2019

У меня есть приложение SwiftUI, и у меня возникают проблемы с правильной работой навигации. Все, что близко к работе, просто ощущается вместе. У меня есть выдвижное меню, которое я сделал, следуя этому руководству. Выдвижное меню выглядит следующим образом. У меня также есть несколько видов, которые я хотел бы показать, когда элемент изВыдвижное меню выбрано. Я хочу, чтобы это выглядело так. У меня есть класс для меню, как показано ниже.

enum menuItems {
    case Subview1
    case Subview2
    case Subview3
    case Subview4
    case Subview5
}

class SideMenu: ObservableObject {
    @Published var show: Bool = false
    @Published var selection: menuItems = menuItems.Events
}

Тогда мой ContentView показан ниже

struct ContentView: View {
    @EnvironmentObject var menu: SideMenu
    var body: some View {
        GeometryReader { geometry in
            MainView()
            .frame(width: geometry.size.width, height: geometry.size.height)
                .offset(x: self.menu.show ? geometry.size.width/2 : 0)
            .disabled(self.menu.show ? true : false)
            if self.menu.show {
                MenuView()
                    .frame(width: geometry.size.width/2)
                    .transition(.move(edge: .leading))
            }
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

struct MainView: View {
    @EnvironmentObject var menu: SideMenu
    var featureDetailView: some View {

        switch menu.selection {
        case menuItems.Subview1:
            return AnyView(Subview1())
        case menuItems.Subview2:
            return AnyView(Subview2())
        case menuItems.Subview3:
            return AnyView(Subview3())
        case menuItems.Subview4:
            return AnyView(Subview4())
        case menuItems.Subview5:
            return AnyView(Subview5())
        }
    }

    var body: some View {
        NavigationView {
            featureDetailView
                .navigationBarTitle(Text("Subview 1 Title"), displayMode: .inline)
                .navigationBarItems(leading: (
                    Button(action: {
                        withAnimation {
                            self.menu.show.toggle()
                        }
                    }) {
                        Image(systemName: "line.horizontal.3")
                            .imageScale(.large)
                            .foregroundColor(.white)
                    }
                ))
                .background(NavigationConfigurator { nc in
                    nc.navigationBar.barTintColor = .systemBlue
                    nc.navigationBar.titleTextAttributes = [.foregroundColor : UIColor.white]
                })
            }
        .navigationViewStyle(StackNavigationViewStyle())
    }
}

struct MainView_Previews: PreviewProvider {
    static var previews: some View {
        MainView()
    }
}

ИтакContentView отвечает за отображение MainView или выдвижного меню. Затем MainView покажет правильное подпредставление на основе значения menu.selection. Все это работает, но работа с навигацией является грязной, и я хотел бы знать, есть ли лучший способ сделать это? У меня также были проблемы с изменением navigationBarTitle при отображении другого подпредставления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...