如何在Xcode 13.0 Beta 5 + macOS 12.1 Beta下为SwiftUI Table添加超过10列
问题根因
该10列上限并非SwiftUI Table组件本身的功能限制,而是SwiftUI结果构建器(Result Builder)的默认语法限制:所有结果构建器的默认实现最多支持10个同类型直接子元素,超过该数量时编译器无法识别,需要手动分组突破限制。
可行解决方案
方案1:手动分组TableColumn
使用Group对列进行拆分,每个Group内的列数不超过10个即可正常编译运行,修改后的代码如下:
import SwiftUI struct Person: Identifiable { let givenName: String let familyName: String let id = UUID() } private var people = [ Person(givenName: "Juan", familyName: "Chavez"), Person(givenName: "Mei", familyName: "Chen"), Person(givenName: "Tom", familyName: "Clark"), Person(givenName: "Gita", familyName: "Kumar"), ] struct ContentView: View { var body: some View { Table(people) { // 第一个Group最多放10列 Group { TableColumn("Column1", value: \.givenName) TableColumn("Column2", value: \.familyName) TableColumn("Column3", value: \.givenName) TableColumn("Column4", value: \.familyName) TableColumn("Column5", value: \.givenName) TableColumn("Column6", value: \.familyName) TableColumn("Column7", value: \.givenName) TableColumn("Column8", value: \.familyName) TableColumn("Column9", value: \.givenName) TableColumn("Column10", value: \.familyName) } // 超出10列的部分放在第二个Group Group { TableColumn("Column11", value: \.givenName) TableColumn("Column12", value: \.familyName) } } } } struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView() } }
如果后续需要加更多列,只要继续新增Group、每个Group内列数不超过10即可。
方案2:升级开发环境
如果将开发环境升级到Xcode 14及以上、部署目标设置为macOS 13及以上,SwiftUI内置的Table结果构建器已经新增了更多元素数量的重载,最多支持20个直接子列元素,不需要手动分组即可正常编译。
方案3:动态列构造
如果需要支持远超20列的场景,可以提前把列配置封装成数组,使用Table的动态列构造接口,完全不受结果构建器的数量限制。
内容的提问来源于stack exchange,提问作者Scott
相关产品推荐
相关产品推荐

