通过更改SwiftUI中的@State变量来刷新视图不起作用

如何解决通过更改SwiftUI中的@State变量来刷新视图不起作用

因此,为了简单起见,我将首先描述代码功能方式。我有一个列表,该列表是通过使用ForEach循环遍历AWS数据库生成的。

List{
    ForEach(self.data.database1){ row in
         HStack {
              Button("\((row.name)!)") { 
                   self.selectedItem = row.id
                   self.selectedItemName = row.poi!
                   self.pressedItem = true
                                
              }
                            
              Spacer()
              Button("Delete") {
                  self.selectedItem = row.id
                  self.showDeleteItemView = true
          //this brings up a view that can confirm you want to delete
              }.buttonStyle(BorderlessButtonStyle())                        
                        }
                    }
                    
                }

列表中的每一行都包含一个删除”按钮。此删除按钮将打开以下视图:

if self.showDeleteEventView == true {
    ConfirmActionView(showView: self.$showDeleteItemView,actionName: "delete this event",function: {
              
                    for item in self.data.database1{
                        if self.selectedItem == item.id{
                            dispatchQueue.main.async {
                                self.data.deleteItem(id: event.id)
                                self.reloadView.toggle()
                            }
                        }
                    }
               
            },buttonLabel: "Delete")
        }

视图是:

struct ConfirmActionView: View {
@Binding var showView: Bool
var actionName: String
var function: () -> Void
var buttonLabel: String
var body: some View {
    ZStack {
         vstack {
                HStack {
                    Spacer()
                    Button("X") {
                        self.showView = false
                    }
                }
                Text("Are you sure you want to \(self.actionName)?")
                    
                Spacer()
                HStack {
                    Button("\(self.buttonLabel)") {
                        print("confirmed action")
                        self.function()
                        self.showView = false
                    }
                   
                    
                    Button("Cancel") {
                        self.showView = false
                    }
                    .padding(EdgeInsets(top: 6,leading: 6,bottom: 6,trailing: 6))
                    
                }
                    
            }.frame(width: 300,height: 150)
            }
    }
}

deleteItem()函数如下:

func deleteItem(id: Int) {
    let baseUrl = URL(string: itemUrl)
    let deletionUrl = baseUrl!.appendingPathComponent("\(id)")
    print("Deletion URL with appended id: \(deletionUrl.absoluteString)")

    var request = URLRequest(url: deletionUrl)
    request.httpMethod = "DELETE"
    print(token) // ensure this is correct
    request.allHTTPHeaderFields = ["Authorization": "Token \(token)"]
    let task = URLSession.shared.dataTask(with: request) { data,response,error in
        if let error = error {
            print("Encountered network error: \(error)")
            return
        }
        
        if let httpResponse = response as? HTTPURLResponse {
            // this is basically also debugging code
            print("Endpoint responded with status: \(httpResponse.statusCode)")
            print("                   with headers:\n\(httpResponse.allHeaderFields)")
        }
        // Debug output of the data:
        if let data = data {
            let payloadAsSimpleString = String(data: data,encoding: .utf8) ?? "(can't parse payload)"
            print("Response contains payload\n\(payloadAsSimpleString)")
        }
    }
    task.resume()
}

stateVariable1是用于保存行中项目名称的变量。 reloadView是一个@State布尔变量,因此我认为如果切换它,则应从数据库删除该项目后刷新视图。我想像的代码功能一样,除了reloadView切换开关实际上并没有重新加载视图。

解决方法

如果您的数据可以更改,则需要动态变量ForEach

尝试更换:

List {
    ForEach(self.data.database1) { row in
         HStack {
             ...

具有:

List {
    ForEach(self.data.database1,id: \.id) { row in
         HStack {
             ...

编辑

在删除项目后,您的数据似乎也没有刷新-您从服务器中删除了它,但未从本地删除它。

您可以在删除项目后重新加载它:

func deleteItem(id: Int) {
    ...
    let task = URLSession.shared.dataTask(with: request) { data,response,error in
        ...
        if let data = data {
            let payloadAsSimpleString = String(data: data,encoding: .utf8) ?? "(can't parse payload)"
            print("Response contains payload\n\(payloadAsSimpleString)")
        }

        // here you can reload data from the server
        // or pass function (which reloads data) as a parameter and call it here
    }
    task.resume()
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?