У меня есть приложение 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 при отображении другого подпредставления.