为什么当我改变字符串长度时,表格中的TableColumn不会动态调整宽度,且宽度属性被设置为“无穷大”?

移动开发 2026-07-10

我希望Table中的TableColumn能根据字符串的长度动态调整大小;如果字符串的长度超过表格的宽度,就会出现水平滚动条。我把.width属性设为infinity(如手册所述,这应能强制列动态调整大小),但并不起作用。我不明白为什么?

这是我的代码:

import SwiftUI
import Foundation
//identify structure for array and table
struct myItem: Identifiable {
    let id = UUID()
    let myItemStr: String
}
struct ContentView: View {
    //variable for title in the table
    @State private var myTableTitleStr: String = "My Items"
    //set single selection for table
    @State private var selectedItemID: myItem.ID?
    //array for filling table
    @State private var myItemsArray = [myItem(myItemStr: "Item01"), myItem(myItemStr: "Item02"), myItem(myItemStr: "Item03")]

    var body: some View {
        VStack {
            //myTable
            Table(myItemsArray, selection: $selectedItemID) {
                TableColumn(myTableTitleStr, value: \.myItemStr)
                    .width(min: 50, ideal: 350, max: .infinity) //this should set up the row resizes dynamically.
            }
            //myButton
            Button(/*@START_MENU_TOKEN@*/"Button"/*@END_MENU_TOKEN@*/) {
                //my long string
                let myLongString = "my very very very very very very very very very very very very very very very very very long string"
                //set up long string to the first row
                myItemsArray[0] = (myItem(myItemStr: myLongString))
            }            
        }
        .padding()
        .frame(width: 400.0, height: 400.0)
    }
}

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

解决方案

Table 在SwiftUI中并不是这样工作的。

当你设置Table时,SwiftUI会读取你最初定义表格内容(列、宽度、标题)时所用的度量信息来建立表格。随后它不会在运行时更新这些布局值,除非表格被完全重新加载。

如果你有一个只有一列的表格,想要动态调整其宽度,使用一个 ListLazyVStack,它们更适合完成这项任务。

如果你有多列但想实现动态调整,你就必须使用AppKit来编写。SwiftUI现在还没有提供实现它的工具。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章