大家都知道,從 SwiftUI 2.0 開始,List 就支持了遞回資料的分層展示。
我的遞回資料結構樹定義如下:
class Tree<Value: Hashable>: Hashable {
static func == (lhs: Tree<Value>, rhs: Tree<Value>) -> Bool {
lhs.value == rhs.value
}
func hash(into hasher: inout Hasher) {
hasher.combine(value)
}
let value: Value
var children: [Tree]? = nil
init(value: Value, children: [Tree]? = nil){
self.value = value
self.children = children
}
}
我的模型定義如下:
class Model: ObservableObject {
@Published var trees = [Tree<String>]()
}
最后是我的 TreeView 定義:
struct TreeView: View {
@StateObject var model = Model()
var body: some View {
VStack {
HStack {
Spacer()
Button(" "){
let new = Tree(value: String(UUID().uuidString.prefix(16)))
// List can be refreshed in time
model.trees.append(new)
}
}
.padding()
Text("Tree")
.font(.title)
Spacer()
List {
ForEach(model.trees, id: \.value){ section in
Section(header: HStack {
Text("\(section.value)")
Spacer()
Button(" "){
let new = Tree(value: String(UUID().uuidString.prefix(8)))
var new_children: [Tree<String>]
if let children = section.children {
new_children = children
new_children.append(new)
}else{
new_children = [new]
}
// List can't be refreshed in time
section.children = new_children
}
.buttonStyle(BorderlessButtonStyle())
}){
OutlineGroup(section.children ?? [], id: \.value, children: \.children){tree in
HStack {
Text(tree.value)
Spacer()
Button(" "){
let new = Tree(value: String(UUID().uuidString.prefix(8)))
var new_children: [Tree<String>]
if let children = tree.children {
new_children = children
new_children.append(new)
}else{
new_children = [new]
}
// List can't be refreshed in time
tree.children = new_children
}
.buttonStyle(BorderlessButtonStyle())
}
}
}
}
}
.listStyle(SidebarListStyle())
}
}
}
struct ProductListView_Previews: PreviewProvider {
static var previews: some View {
TreeView()
}
}
當我在model.trees陣列中添加新Tree時,List可以及時重繪 ,但是當我給trees陣列中的一個元素添加新Tree時(例如:model.trees[0]),List就不能神清氣爽。
添加子樹時如何及時重繪 串列?謝謝!
uj5u.com熱心網友回復:
作為每個“ ”按鈕插入的第一個命令:
model.objectWillChange.send()- 然后它作業。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/425478.html
