gpt4 book ai didi

swiftui - 如何在 SwiftUI 中自动添加列表元素之间的分隔线?

转载 作者:行者123 更新时间:2023-12-05 02:48:20 25 4
gpt4 key购买 nike

我正在尝试复制 List 的一些行为。我特别想在所有元素之间添加分隔符。我当前的代码如下所示

Customlist {
Text("...")
Divider()
Text("...")
Divider()
Text("...")
}

我想删除分隔符并只提供文本节点,但我不知道如何在 Customlist 中自动插入分隔符。所以我想要的用法是这样的:

Customlist {
Text("...")
Text("...")
Text("...")
}

我假设 Customlist 必须看起来像这样(但我不知道如何实现 body):

Customlist<Content: View>: View {
var content: Content

init(@ViewBuilder _ b: () -> Content) {
self.content = b()
}

var body: some View {
// Something using self.content here
}
}

最佳答案

  1. 行发送rowID(使用PreferenceKey)到列表。
  2. List 获取所有行的 id,并将最后一个 id 发送给 row。
  3. 行检查 self'id 是否等于最后一行 id。
/// store all row ids.
fileprivate struct RowsPreferenceKey: PreferenceKey {
static var defaultValue: [Namespace.ID] = []
static func reduce(value: inout [Namespace.ID], nextValue: () -> [Namespace.ID]) {
value.append(contentsOf: nextValue())
}
}

extension EnvironmentValues {

fileprivate struct LastRowKey: EnvironmentKey {
static var defaultValue: Namespace.ID? = nil
}

/// identity this row id, is last item in list
var lastRowID: Namespace.ID? {
get { self[LastRowKey.self] }
set { self[LastRowKey].self = newValue }
}
}

struct Row<Content: View>: View {

@Environment(\.lastRowID) var lastRowID
@Namespace var id

var content: Content

init(@ViewBuilder content: () -> Content) {
self.content = content()
}

var body: some View {
VStack {
content
// check self is last row
if lastRowID != id {
Divider()
}
// send row id to list.
}.preference(key: RowsPreferenceKey.self, value: [id])
}

}


struct DividerList<Content: View>: View {

var content: Content

init(@ViewBuilder content: () -> Content) {
self.content = content()
}

@State var lastRowID: Namespace.ID?

var body: some View {
VStack { content }
.onPreferenceChange(RowsPreferenceKey.self, perform: { value in
self.lastRowID = value.last
})
/// send row id to Childs
.environment(\.lastRowID, lastRowID)
}

}

struct DividerList_Previews: PreviewProvider {
static var previews: some View {
DividerList {
Row {
Text("Hello")
}

Row {
Text("World")
}

Row {
Text("!!!")
}
}
}
}


preview

关于swiftui - 如何在 SwiftUI 中自动添加列表元素之间的分隔线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64552511/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com