繁体   English   中英

如何以编程方式从 UITableView 中删除一行并更新 UI

[英]How do I delete a row from a UITableView programmatically and update the UI

更新:

我发现了更新UITableView之前最多需要 10 秒的原因。 它与我发送到我的服务器的 HTTP POST 请求有关。 以下是我在阅读所有答案并在线搜索后截至目前的代码。 原因是变量indexindexPath以及对self.tableView(tableView: UITableView UITableView, commit: UITableViewCellEditingStyle, forRowAt: IndexPath)

如果我将它们移到task关闭之外,它们会立即执行,但我不希望它们移到外面,因为在删除之前我需要服务器的“OK”。

问题不在于服务器响应时间,因为我立即得到响应。 我认为这与我不太熟悉的task.resume()有关。

foreach expense in expenses {
    var request = URLRequest(url: URL(string: Constants.ZEBON_SERVER_URL)!)
    request.httpMethod = "POST"
    let postString = "date=\(expense.date)&amount=\(expense.amount)&note=\(expense.desc)"
    request.httpBody = postString.data(using: .utf8)
    let task = URLSession.shared.dataTask(with: request) {
        (data: Data?, response: URLResponse?, error: Error?) in

        if error != nil {
            print("error = \(error)")
        }

        // If the server responds with "OK" (the request was received) then delete the expense
        if responseString?.range(of:"return\":\"ok") != nil {
            let index = self.expenses.index(of: expense)
            let indexPath = IndexPath(row: index!, section: 0)

            // Deletes the expense
            self.tableView(self.tableView, commit: .delete, forRowAt: indexPath)
        }
        else {
            // TODO: Implement error handling.
        }
   }
   task.resume()
}

原问题:

我有一些显示在UITableView对象。 当我按下一个按钮时,它们被发送到服务器并且应该从 tableView 中删除。

我当前的代码如下所示:

let index = self.expenses.index(of: expense)
let indexPath = NSIndexPath(row: index!, section: 0)
self.expenses.remove(at: indexPath.row)

// Saves the array 'Expenses' to persistent storage.
self.saveExpenses()

self.tableView.beginUpdates()
self.tableView.deleteRows(at: [indexPath as IndexPath], with: .none)
self.tableView.endUpdates()

我的问题是费用被发送到服务器并从存储中删除,但UITableView不会刷新,因此当我无法以任何方式与其交互时,单元格保持可见。

更新 UI保存数组。

实际上这些行就足够了, begin/endUpdates()对单个删除操作没有影响。

let index = self.expenses.index(of: expense)
let indexPath = IndexPath(row: index!, section: 0)
self.expenses.remove(at: index!)
DispatchQueue.main.async {
    self.tableView.deleteRows(at: [indexPath], with: .none)
}

// Saves the array 'Expenses' to persistent storage.
self.saveExpenses()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM