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

时间:2016-10-06 11:51:27

标签: ios uitableview swift3 xcode8

更新

我在更新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没有刷新,因此当我无法以任何方式与其进行交互时,单元格保持可见。

1 个答案:

答案 0 :(得分:1)

在更新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()