ios - SwiftUI:NavigationView 内 TabBar 内的 ListView 生成空 View

标签 ios listview swiftui navigationview tabview

我在 TabView 内有两个 ListView,而 TabView 又在 NavigationView 内。

当我运行此代码并滚动 ListView 内容时,我看到正在生成一个空 View ,该 View 似乎位于 ListView 行的顶部。

当 ListView 一直滚动到顶部时,它完全覆盖第一个项目。

import SwiftUI

struct ContentView: View {

    @State private var gibsonGuitars = [ Guitar(id: 1, name: "Les Paul")]
    @State private var fenderGuitars = [ Guitar(id: 1, name: "Stratorcaster")]
    @State private var selectedView = 0

    private let brandGibson = "Gibson Guitars"
    private let brandFender = "Fender Guitars"

    private var title: String {
        $selectedView.wrappedValue == 0 ? brandGibson : brandFender
    }

    var body: some View {
        NavigationView {
            TabView(selection: $selectedView) {
                GuitarListView(guitars: $gibsonGuitars)
                    .tabItem {
                        Image(systemName: "guitars")
                        Text(brandGibson)
                    }
                    .tag(0)
                GuitarListView(guitars: $fenderGuitars)
                    .tabItem {
                        Image(systemName: "guitars")
                        Text(brandFender)
                    }
                    .tag(1)
                }
                .navigationBarTitle(Text(title))
            GuitarDetail()
        }
        .navigationViewStyle(DoubleColumnNavigationViewStyle())

    }
}

struct Guitar: Identifiable {
    var id: Int
    var name: String
}

struct GuitarListView: View {
    @Binding var guitars: [Guitar]
    var body: some View {
        List(guitars) { guitar in
            Text(guitar.name)
        }.listStyle(GroupedListStyle())
    }
}

struct GuitarDetail: View {
    @State var guitar: Guitar?
    var body: some View {
        guard let guitar = guitar else {
            return Text("No Guitar Selected.")
        }
        return Text("\(guitar.name)").font(.largeTitle)
    }
}

这是什么?我该如何避免它?

enter image description here enter image description here

最佳答案

归根结底,这是我对 SwiftUI 中的安全区域缺乏了解造成的。我可以通过添加 .edgesIgnoringSafeArea(.top)

来修复它
    import SwiftUI

struct ContentView: View {

    @State private var gibsonGuitars = [ Guitar(id: 1, name: "Les Paul")]
    @State private var fenderGuitars = [ Guitar(id: 2, name: "Stratorcaster")]
    @State private var selectedView = 0

    private let brandGibson = "Gibson"
    private let brandFender = "Fender"

    private var title: String {
        $selectedView.wrappedValue == 0 ? brandGibson : brandFender
    }

    var body: some View {
        NavigationView {
            TabView(selection: $selectedView) {
                    GuitarListView(guitars: $gibsonGuitars)
                        .tabItem {
                            Image(systemName: "guitars")
                            Text(brandGibson)
                        }
                        .tag(0)
                    GuitarListView(guitars: $fenderGuitars)
                    .tabItem {
                        Image(systemName: "guitars")
                        Text(brandFender)
                    }
                    .tag(1)
            }
            .edgesIgnoringSafeArea(.top)
            .navigationBarTitle(title)
            GuitarDetail()
        }
        .navigationViewStyle(DoubleColumnNavigationViewStyle())
    }
}

struct Guitar: Identifiable {
    var id: Int
    var name: String
}

struct GuitarListView: View {
    @Binding var guitars: [Guitar]
    var body: some View {
        List(guitars) { guitar in
            Text(guitar.name)
        }.listStyle(GroupedListStyle())
    }
}

struct GuitarDetail: View {
    @State var guitar: Guitar?
    var body: some View {
        guard let guitar = guitar else {
            return Text("No Guitar Selected.")
        }
        return Text("\(guitar.name)").font(.largeTitle)
    }
}

关于ios - SwiftUI:NavigationView 内 TabBar 内的 ListView 生成空 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58101814/

相关文章:

ios - UIView 动画 block 暂停动画和完成代码

android - 带有复选框的自定义 ListView 检查未选中的项目

java - ListView 适配器行为异常。在我单击同一个 ListView 中的按钮后,ListView 中不相关的按钮被单击

android - 您如何通过 Android 中的 onlistitemclick 更改各个 ListView 行内的小部件的可见性?

swiftui - 如何从 SwiftUI 2.0 中的多个其他 View 访问和编辑 @AppStorage 变量?

ios - 在常规应用程序中使用报亭

ios - 从自定义单元格获取数据到 TableViewController

ios - Swift 4 从另一个项目中获取钥匙串(keychain)数据

ios - 添加按钮到列表单元格

swift - 自定义 URL 方案不适用于 Swift 5、Xcode 11