Как запустить новый View в SwiftUI из меню слайдера, чтобы он не запускался внутри самого слайдера

Итак, я использую SwiftUI и у меня есть окно ползунка / боковое меню. Когда я запускаю слайдер, он оказывается поверх экрана и занимает примерно половину ширины экрана. Он предоставляет пользователю несколько вариантов. Когда я щелкаю элемент в этом меню, новое представление отображается внутри окна меню ползунка с половинной шириной. Я хочу, чтобы он закрыл ползунок, а затем вместо этого запустил новый полноэкранный режим. Нужна помощь.

Вот слайдер в действии ...

введите здесь описание изображения

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

Вот код.

struct ContentView : View {

@EnvironmentObject var session: SessionStore
    @State var showMenu = false
    @State var isDrawerOpen: Bool = falsevar body: some View {

    let drag = DragGesture()
        .onEnded {
            if $0.translation.width < -100 {
                withAnimation {
                    self.showMenu = false
                }
            }
        }

    return NavigationView {
        Group{
            GeometryReader { geometry in
            ZStack(alignment: .leading) {

            // if the user is logged in, then show the mainview.
            // if the slider is active, then show the slider on top of mainview
            // if the user is not yet logged in then show the login window

                if (self.session.session != nil) {
                    MainView(showMenu: self.$showMenu)
                        .frame(width: geometry.size.width, height: geometry.size.height)
                        .offset(x: self.showMenu ? geometry.size.width/2 : 0)
                        .disabled(self.showMenu ? true : false)
                    if self.showMenu {
                        MenuView()
                            .frame(width: geometry.size.width/2)
                            .transition(.move(edge: .leading))
                    }
                } else {

                    SignInView()

                }
            }//
                .gesture(drag)
        }
            .navigationBarTitle(...

Теперь, в моем коде меню слайдера, вы увидите, где я запускаю представление, когда кто-то нажимает кнопку. Я установил NavigationLink с целевым представлением «DrawerContent». Когда я выбираю пункт меню ниже для «Игроки», он сразу запускает представление DrawerContent, но застревает внутри меню ползунка. Смотрите скриншот ниже ...

struct DrawerContent: View {
    var body: some View {
        //Color.blue
        VStack{
            Text("hello there")
        }
    }
}




struct MenuView: View {

    @State var showMenu = false

var body: some View {

VStack(alignment: .leading) {

    NavigationView{

        List {
            NavigationLink(destination: DrawerContent()
            ) {
                VStack(alignment: .leading){
                    Text("Players")
                        //.font(.system(size: 14))
                }

            }

Вот скриншот ...

введите здесь описание изображения


person phil    schedule 01.01.2020    source источник


Ответы (1)


Я полагаю, это связано с использованием другого NavigationView в вашем MenuView, как показано ниже

struct MenuView: View {

   @State var showMenu = false

    var body: some View {
       VStack(alignment: .leading) {
           NavigationView{ // <<< this is not needed

Просто удалите его, и он будет использоваться NavigationView из ContentView

person Asperi    schedule 02.01.2020
comment
Это круто, Аспери. Спасибо. Последний вопрос (никаких обещаний). Теперь, когда он запускается в полном окне так красиво, он показывает ссылку возврата навигации вверху, которая отправляет пользователя обратно в боковое меню / меню слайдера. Я могу смириться с этим, но мне было интересно, есть ли способ вернуть его в ContentView? Возможно, я мог бы вообще удалить обратную ссылку, но это похоже на утечку памяти ... - person phil; 02.01.2020
comment
Я предполагаю, что он уже находится в ContentView, просто нужно скрыть меню при активации ссылки. - person Asperi; 02.01.2020