SwiftUI,弹出.sheet时@State var异常清除

问题描述 投票:0回答:1

在下面的代码中,

我期望得到以下结果:当单击“管理”按钮时,弹出的工作表将显示“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()
}

swift swiftui
1个回答
0
投票

我找到了解决问题的办法,就是当我点击

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)
© www.soinside.com 2019 - 2024. All rights reserved.