第三十一章 完善箱号列表

我们已经通过栈版号获取到了箱子列表数据,那么我们用List将数据展示出来。

BoxDetailModel 实现 Identifiable 协议

swift 复制代码
extension BoxDetailModel: Identifiable {
    var id: String { boxCode ?? "" }
}

List + ForEach 实现列表

swift 复制代码
struct PalletBindBoxNumberPage: View {
    ...
    var body: some View {
        ... {
            ... {
               ...
                List {
                    ForEach(viewModel.boxDetailModels) { model in
                        BoxDetailView()
                    }
                }
            }
        }
        ...
    }
}

List 构建的是否存在性能问题?

看了视图,核心还是利用UITableView重用的机制,所以使用List展示很多数据,是会走重用机制的。

设置 List 的 Style

swift 复制代码
struct PalletBindBoxNumberPage: View {
    ...
    var body: some View {
        ... {
            ... {
                ... {
                List {
                	...
                }
                .listStyle(.plain)
            }
        }
        ...
    }
}

通过 listRowInsets 设置 Row 的间隙

显示出来的间隙,明显和我们BoxDetailView的间隙大很多,为了看一下差距,我们给BoxDetailView设置一个红色背景色。

看起来左右留白多一些,上下留白很少。

swift 复制代码
struct PalletBindBoxNumberPage: View {
    ...
    var body: some View {
        PageContentView(title: "托盘绑定箱号", viewModel: viewModel) {
            VStack(spacing:0) {
                ...
                List {
                    ForEach(0 ..< 10) { model in
                        BoxDetailView()
                            ...
                            .listRowInsets(EdgeInsets(top: 0, leading: 0, bottom: 0, trailing: 0))

                    }

                }
                ...
            }
        }
        ...
    }
}

通过 listRowInsets 增加 Cell 之间的间隙

swift 复制代码
struct PalletBindBoxNumberPage: View {
    ...
    var body: some View {
        PageContentView(title: "托盘绑定箱号", viewModel: viewModel) {
            VStack(spacing:0) {
                ...
                List {
                    ForEach(0 ..< 10) { model in
                        BoxDetailView()
                            .listRowInsets(EdgeInsets(top: 0, leading: 0, bottom: 5, trailing: 0))
                    }
                }
                ...
            }
        }
        ...
    }
}

通过 listRowBackground 设置背景颜色

上图完全看不到Cell之间的坚决,我们可以通过listRowBackground进行设置颜色,来区分Cell

swift 复制代码
struct PalletBindBoxNumberPage: View {
    ...
    var body: some View {
        PageContentView(title: "托盘绑定箱号", viewModel: viewModel) {
            VStack(spacing:0) {
                ...
                List {
                    ForEach(0 ..< 10) { model in
                        BoxDetailView()
                            ...
                            .listRowBackground(Color.clear)
                    }
                }
                ...
            }
        }
        ...
    }
}

通过 listRowSeparator 隐藏 Cell 的 Separator

swift 复制代码
struct PalletBindBoxNumberPage: View {
    ...
    var body: some View {
        PageContentView(title: "托盘绑定箱号", viewModel: viewModel) {
            VStack(spacing:0) {
                ...
                List {
                    ForEach(0 ..< 10) { model in
                        BoxDetailView()
                            ...
                            .listRowSeparator(.hidden)
                    }
                }
                ...
            }
        }
        ...
    }
}

传递 Model 到 BoxDetailView 赋值

swift 复制代码
struct BoxDetailView: View {
    private let model:BoxDetailModel
    init(model:BoxDetailModel) {
        self.model = model
    }
    var body: some View {
        HStack {
            VStack {
                TitleValueView(...,
                               value: model.skuCode ?? "")
                ...
                TitleValueView(...,
                               value: model.skuBatch ?? "")
            }
            VStack {
                TitleValueView(...,
                               value: model.paperCode ?? "",
                               ...)
                ...
                TitleValueView(...,
                               value: model.boxCode ?? "",
                               ...)
            }
        }
        ...
    }
}
swift 复制代码
struct PalletBindBoxNumberPage: View {
    ...
    var body: some View {
        PageContentView(title: "托盘绑定箱号", viewModel: viewModel) {
            VStack(spacing:0) {
                ...
                List {
                    ForEach(viewModel.boxDetailModels) { model in
                        BoxDetailView(model: model)
                            ...
                    }
                }
                ...
            }
        }
        ...
    }
}
相关推荐
君赏3 小时前
第三十二章 接下来我们开始做`灭菌整板`页面
swiftui
君赏3 小时前
第三十章 接下来我们写首页的功能,首先是我们的`托盘绑定箱号`。
swiftui
君赏3 小时前
第二十五章 完善登录逻辑
swiftui
君赏3 小时前
第二十六章 Focused
swiftui
君赏3 小时前
第 二十章 @Published sink
swiftui
君赏3 小时前
第二十一章 @ViewBuilder默认实现|Toggle|我的页面封装
swiftui
君赏3 小时前
第二十九章 修复首页 PopMenuView 显示问题
swiftui
君赏3 小时前
第二十八章 重置 ObservableObject 模型数据
swiftui
君赏3 小时前
第二十七章 UINavigationBarAppearance|Divider
swiftui