SwiftUI制作一个只显示一定数量行的列表

SwiftUI制作一个只显示一定数量行的列表,swiftui,ios13,swiftui-list,Swiftui,Ios13,Swiftui List,我最近开始玩弄SwiftUI,到目前为止它还不错。然而,我提出了一个似乎找不到答案的问题 我正在尝试创建此设计: 如您所见,这里有一个tableview(列表),其中的行中有一个较小的tableview(列表)。使用IB时,任务非常简单,但使用swiftUI时,我似乎找不到一种方法将行数限制在我需要的数量,或者根据行数手动设置列表高度(请记住,这些行的高度也可以是可变的) 到目前为止,我的代码只包括创建列表和添加2个测试行: List { OrderItemRow() Orde

我最近开始玩弄SwiftUI,到目前为止它还不错。然而,我提出了一个似乎找不到答案的问题

我正在尝试创建此设计:

如您所见,这里有一个tableview(列表),其中的行中有一个较小的tableview(列表)。使用IB时,任务非常简单,但使用swiftUI时,我似乎找不到一种方法将行数限制在我需要的数量,或者根据行数手动设置列表高度(请记住,这些行的高度也可以是可变的)

到目前为止,我的代码只包括创建列表和添加2个测试行:

List {
    OrderItemRow()
    OrderItemRow()
}
但正如您所看到的,SwiftUI会自动扩展列表以填充所有可用空间。其效果是:

我建议使用ForEach显示您的订单,使用嵌套ForEach显示订单中的项目。关键是管理提供给每个ForEach的数据,使其达到所需的项数,并为OrderHeaderRow、OrderItemRow等构建适当的行视图

struct OrdersView: View {
    var body: some View {
        List {
            Section(header: Text("Current Order")) {
                OrderHeaderRow(order: currentOrder)
                ForEach(self.arrayOfAllItemsInOrder(currentOrder)) { item in
                    OrderItemRow(currentOrder: order, item:item)
                }
                OrderTotalRow(order: order)
                ActionButtonsRow(order:order)
            }
            Section(header: Text("Previous Orders")) {
                ForEach(self.arrayOfAllPreviousOrders) { order in
                    OrderHeaderRow(order: order)
                    ForEach(self.arrayOfAllItemsInOrder(order)) { item in
                        OrderItemRow(order: order, item:item)
                    }
                    OrderTotalRow(order: order)
                    ActionButtonsRow(order:order)
                }
            }
        }
    }
}

如果您知道行的高度,可以通过以下方式实现:

List(self.arrayOfAllItemsInOrder(currentOrder)){item in
OrderItemRow(当前订单:订单,项目:项目)
}
.environment(\.defaultMinListRowHeight,rowHeight)
.frame(高度:self.arrayOfAllItemsInOrder.reduce(0){i,u在i+rowHeight})
这将根据
行高
计算列表的完整大小,并限制帧的高度


请注意,如果您的行大小超过
行高
,整个计算将混乱,您可能会看到一半(或缺少整个)单元格。

对于此UI设计,我不会选择列表,而是
OrderView的
滚动视图
,您最终是如何解决的?我每一行都有一个导航链接,所以我想知道哪一行可以正常工作。问题是,如果没有设置列表高度的机制,它会自动填满整个屏幕,弄乱设计。正如你在我的代码截取中看到的,我只是用两行填充这个列表。有没有办法限制行数?或者手动设置高度?看起来您可能试图强制SwiftUI列表执行它不打算执行的操作。不要将订单页眉和订单页脚视图放在列表之外,只需将它们列在列表中即可。仅供参考,列表中的行不必都是相同类型的视图。我将编辑我的答案,以显示一些伪代码来演示我所说的内容。