在下面的代码中,
我期望得到以下结果:当单击“管理”按钮时,弹出的工作表将显示“tags”数组的内容[“test1”,“test2”,“test3”]。
然而实际结果是,当点击“管理”按钮时,弹出的表单是空白的,“tags”数组的内容被清空了。
我发现当我删除表单时,它按预期工作。
但是,当我添加Form时,出现了问题。
或者,当我在TagView中不使用removeAll时,也不会出现这个问题。
你能告诉我为什么会发生这种情况吗?
import SwiftUI
struct ContentView: View {
@State private var showingTagManagement = false
@State private var tags: [String] = ["test1", "test2", "test3"]
var body: some View {
Form{
VStack() {
// Selected Tags
ForEach(tags, id: \.self) { tag in
TagView(tag: tag) {
tags.removeAll { $0 == tag }
}
}
// Manage Tags Button
Button(action: { showingTagManagement = true }) {
Text("Manage")
}
}
.sheet(isPresented: $showingTagManagement) {
testView(tags: $tags)
}
}
}
}
struct TagView: View {
let tag: String
let onDelete: () -> Void
var body: some View {
HStack(spacing: 4) {
Text(tag)
Button(action: onDelete) {
Image(systemName: "xmark.circle.fill")
}
}
}
}
struct testView: View {
@Binding var tags: [String]
var body: some View {
ForEach(tags, id: \.self) { tag in
Text(tag)
}
Button("test") {
tags.append("test")
}
}
}
#Preview {
ContentView()
}
我找到了解决问题的办法,就是当我点击
Manage
按钮时,我注意到点击事件会覆盖VStack
中的整个Form
。
所以每次我点击
Manage
按钮时,我实际上点击了delete
中的所有TagView
按钮。它清除了tags
。
为了解决这个问题,我只需在
.buttonstyle (.plain)
和 Manage
按钮下添加 delete
Button(action: { showingTagManagement = true }) {
Text("Manage")
}
.buttonStyle(.plain)
Button("test") {
tags.append("test")
}
.buttonStyle(.plain)