1. ホーム
  2. ios

[解決済み] SwiftUI NavigationViewのデフォルトのナビゲーションバースペースを削除する方法

2022-04-26 03:27:50

質問

私はSwiftUIの初心者で(ほとんどの人がそうであるように)、どのようにいくつかの 空白文字 の上にある List に埋め込んだものを NavigationView .

この画像では List .

私が実現したいことは、これです。

を使ってみました。

.navigationBarHidden(true)

が、これでは顕著な変化はありませんでした。

現在、navigiationViewをこのように設定しています。

NavigationView {
    FileBrowserView(jsonFromCall: URLRetrieve(URLtoFetch: applicationDelegate.apiURL))
        .navigationBarHidden(true)
}

ここで FileBrowserView は、ビューに ListFileCell はこのように定義されています。

List {
   Section(header: Text("Root")) {
       FileCell(name: "Test", fileType: "JPG",fileDesc: "Test number 1")
       FileCell(name: "Test 2", fileType: "txt",fileDesc: "Test number 2")
       FileCell(name: "test3", fileType: "fasta", fileDesc: "")
    }
}

最終的な目標は、これらのセルをクリックしてファイル ツリーの奥深くまで移動できるようにすることであり、したがって、より深いナビゲーションでバーに戻るボタンを表示する必要があります。

解決方法は?

なぜか、SwiftUIでは、この他に .navigationBarTitle に対して .navigationBarHidden が正しく動作するようにします。

NavigationView {
    FileBrowserView(jsonFromCall: URLRetrieve(URLtoFetch: applicationDelegate.apiURL))
        .navigationBarTitle("")
        .navigationBarHidden(true)
}


更新情報

コメントで @Peacemoon さんが指摘したように、ナビゲーションバーは、ナビゲーションスタックの奥に移動すると navigationBarHidden から false を表示させることができます。コメントで述べたように、これはApple側の実装が悪いのか、単にドキュメントがひどいのかのどちらかです(もしかしたら、これを達成するための "正しい"方法があるのかもしれませんね)。

いずれにせよ、元の投稿者が望む結果をもたらすと思われる回避策を思いつきました。しかし、ナビゲーションバーを隠したり消したりする簡単な方法がないため、これが私にできる最善の方法です。

この例では、3つのビューを使用しています。 View1 はナビゲーションバーが隠されており View2View3 は、どちらもタイトルが表示されたナビゲーションバーがあります。

struct View1: View {
    @State var isNavigationBarHidden: Bool = true

    var body: some View {
        NavigationView {
            ZStack {
                Color.red
                NavigationLink("View 2", destination: View2(isNavigationBarHidden: self.$isNavigationBarHidden))
            }
            .navigationBarTitle("Hidden Title")
            .navigationBarHidden(self.isNavigationBarHidden)
            .onAppear {
                self.isNavigationBarHidden = true
            }
        }
    }
}

struct View2: View {
    @Binding var isNavigationBarHidden: Bool

    var body: some View {
        ZStack {
            Color.green
            NavigationLink("View 3", destination: View3())
        }
        .navigationBarTitle("Visible Title 1")
        .onAppear {
            self.isNavigationBarHidden = false
        }
    }
}

struct View3: View {
    var body: some View {
        Color.blue
            .navigationBarTitle("Visible Title 2")
    }
}

設定 navigationBarHidden から false を設定したビューの環境設定を正しくオーバーライドしないようです。 navigationBarHiddentrue というわけで、唯一の回避策は、新しいビューがナビゲーションスタックにプッシュされたときに、元のビューのプリファレンスを変更するためのバインディングを使用することでした。

しかし、アップルからの公式な解決策がない以上、これが私が思いついた最善の方法です。