NavigationView с NavigationLinks, заменяющими другую часть экрана?

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

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

Ниже приведен простой фрагмент кода, который не работает, но дает вам над чем поработать. Обе ссылки оставляют красный рекламный баннер внизу. Если я перенесу код рекламного баннера (Spacer и HStack) во внутренний VStack, то обе ссылки перейдут в представление без рекламы.

Как сделать так, чтобы ссылки NavigationLinks работали по-разному в одном и том же представлении, когда одна заменяет весь экран, а другая оставляет рекламу, видимую ниже?

import SwiftUI

struct ContentView: View {
    var body: some View {
        VStack {
            NavigationView {
                VStack {
                    NavigationLink(destination: Text("No Ads")) {
                        Text("Link to a view with no Ads") // How to make this link to hide the Ad below?
                    }
                    NavigationLink(destination: Text("Ad visible")) {
                        Text("Link to a view with same Ad visible") // This link works as expected
                    } // Try moving the Ad banner right under here to see the other beavior
                }
            }
            Spacer() // This below is the Ad banner 
            HStack {
                Spacer()
                Text("Ad is shown here")
                    .padding()
                Spacer()
            }
            .background(Color.red)
        }
    }
}

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

person Hartti Suomela    schedule 05.07.2020    source источник


Ответы (1)


Вы можете отображать рекламный баннер в зависимости от того, по какой ссылке навигации была нажата.

struct ContentView: View {
    @State var firstActive : Bool = false
    @State var secondActive : Bool = false

    var body: some View {
        VStack {
            NavigationView {
                VStack {
                    NavigationLink(destination: Text("No Ads"), isActive: self.$firstActive) {
                        Text("Link to a view with no Ads") // How to make this link to hide the Ad below?
                    }
                    NavigationLink(destination: Text("Ad visible"), isActive: self.$secondActive) {
                        Text("Link to a view with same Ad visible") // This link works as expected
                    } // Try moving the Ad banner right under here to see the other beavior
                }
            }
            
            if (secondActive || (!secondActive && !firstActive))
            {
                Spacer() // This below is the Ad banner
                HStack {
                    Spacer()
                    Text("Ad is shown here")
                        .padding()
                    Spacer()
                }
                .background(Color.red)
            }
        }
    }
}

Использование двух состояний, которые используются в качестве привязки в NavigationLink, будет отслеживать, какая NavigationLink активна. Затем показывать рекламный баннер только тогда, когда он неактивен, или только второй.

person davidev    schedule 05.07.2020
comment
Спасибо! Я знал, что есть простое решение, но мой мозг застрял ... - person Hartti Suomela; 06.07.2020