隐藏和显示SwiftUI `Table`列

xzabzqsa  于 2023-06-21  发布在  Swift
关注(0)|答案(1)|浏览(121)

我正在使用SwiftUI的Table为macOS应用程序生成一个表。我希望能够隐藏基于AppStorage条目的列。TableColumnBuilder似乎不支持条件语句:

Table(tableData) {
    // This does not work:
    if showColumndA {
        TableColumn("Column A", value: \Row.columnA)
    }
    // Other columns genereated here
    // ...
}

有没有一种方法可以用SwiftUI构建一个表,让用户可以选择要显示哪些列?
(根据哪些列可见的所有可能排列显示不同的表对我的情况不起作用)

vq8itlhq

vq8itlhq1#

正如Geoff Hackworth所提到的,似乎有一个针对macOS 14的解决方案(在撰写本文时,这对我来说不是一个选择)。
我最终通过扩展@TableColumnBuilder来支持条件来解决了我的问题(感谢Swift Lee@resultBuilder API的精彩介绍):

extension TableColumnBuilder {
    static func buildEither<Column>(first column: Column) -> Column
        where
            RowValue == Column.TableRowValue,
            Sort == Column.TableColumnSortComparator,
            Column : TableColumnContent
    {
        column
    }

    static func buildEither<Column>(second column: Column) -> Column
        where
            RowValue == Column.TableRowValue,
            Sort == Column.TableColumnSortComparator,
            Column : TableColumnContent
    {
        column
    }
}

下面的小示例应用程序使用我的@TableColumnBuilder扩展随机显示列A或列B:

struct Row: Identifiable {
    let id: UUID
    var columnA: String
    var columnB: String
    var columnC: String

    init(columnA: String, columnB: String, columnC: String) {
        self.id = .init()
        self.columnA = columnA
        self.columnB = columnB
        self.columnC = columnC
    }
}

struct ContentView: View {

    @State
    var showColumn: Bool = Bool.random()

    @State
    var rows: [Row] = [
        .init(columnA: "1a", columnB: "1b", columnC: "1c"),
        .init(columnA: "2a", columnB: "2b", columnC: "2c"),
        .init(columnA: "3a", columnB: "3b", columnC: "3c")
    ]

    var body: some View {
        Table(rows) {
            if showColumn {
                TableColumn("A", value: \.columnA)
            } else {
                TableColumn("B", value: \.columnB)
            }
            TableColumn("C", value: \.columnC)
        }
    }
}

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

相关问题