SwiftUI NavigationView でデフォルトのナビゲーションバーのスペースを削除する方法 質問する

SwiftUI NavigationView でデフォルトのナビゲーションバーのスペースを削除する方法 質問する

私は(ほとんどの人と同じように)SwiftUI の初心者で、に埋め込んだ の上の空白を削除する方法を考えています。ListNavigationView

この画像では、 の上に白いスペースがあることがわかりますList

現行版

私が達成したいのはこれです:

理想バージョン

以下を試してみました:

.navigationBarHidden(true)

しかし、目立った変化はありませんでした。

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

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

ここで、およびs が次のように定義された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: "")
    }
}

ここでの最終的な目標は、これらのセルをクリックしてファイル ツリーのより深いところまで移動できるようにし、より深いところまで移動するときにバーに [戻る] ボタンを表示することですが、最初の表示では上部にそのようなものは表示したくないことに注意してください。

ベストアンサー1

何らかの理由で、SwiftUI が正しく動作する.navigationBarTitleためにも設定する必要があります.navigationBarHidden

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

アップデート

@Peacemoon がコメントで指摘したように、ナビゲーション スタックの奥深くまで移動しても、後続のビューで設定したかどうかに関係なく、ナビゲーション バーは非表示のままですnavigationBarHiddenfalseコメントで述べたように、これは Apple 側の実装が不十分なためか、ドキュメントがひどいためです (これを実現する「正しい」方法があるかもしれません)。

いずれにせよ、私は元の投稿者が望んだ結果を生み出すような回避策を思いつきました。不必要にハックっぽいのでお勧めするのは躊躇しますが、ナビゲーション バーを非表示にしたり表示したりする簡単な方法がないので、これが私にできる最善の策です。

この例では、 と の 3 つのビューを使用しています。 にはView1非表示のナビゲーション バーがあり、View2と のView3両方にタイトル付きの表示ナビゲーション バーがあります。

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

前にも言ったように、これはハッキーな解決策ですが、Apple からの公式な解決策がないので、これが私が思いついた最善の方法です。

おすすめ記事