UITableView deleteRows未更新IndexPaths,导致崩溃索引超出范围



在从列表中删除项目的API调用成功时调用以下代码

self?.myWishlistArry?.remove(at: indexPath.row)
self?.myWishListTableView.deleteRows(at: [indexPath], with: .right)

以下是删除按钮的关闭

myWishlistCell.closureForRemoveBtn = {
[weak self]
(productId, storeid) in
self?.callAlertViewForRemoved(productid: productId, storeId: storeid, indexPath: indexPath)
}

以下是显示警报以供用户确认的代码。

func callAlertViewForRemoved(productid :String, storeId: String, indexPath: IndexPath) {


let alertController = UIAlertController(title: AppLocalString.ITEM_NOT_AVAILABLE_TEXT.localized(), message: AppLocalString.MY_EXLUDE_TEXT.localized(), preferredStyle: .alert)

let okAction = UIAlertAction(title: AppLocalString.ALERT_YES.localized(), style: UIAlertAction.Style.default) {
UIAlertAction in
if self.listBool == false {
//self.listBool = true
self.callRemoveWishlist(productid :productid, storeId: storeId, indexPath: indexPath)
}
}

let cancelAction = UIAlertAction(title: AppLocalString.Cancel_ORDER.localized(), style: UIAlertAction.Style.cancel) {
UIAlertAction in
NSLog("Cancel Pressed")
}

// Add the actions
alertController.addAction(okAction)
alertController.addAction(cancelAction)

self.present(alertController, animated: true, completion: nil)


}

以下是代码api删除

func callRemoveWishlist(productid :String, storeId: String, indexPath: IndexPath)  {

listBool = true
addLoading(view: view, random: removeRandom)
let addFriendsBaseUrl = AppStrings.baseUrl + AppStrings.addToWishlistAPI
var paramDict = [String : Any]()

paramDict = ["type" : "remove",
"productid" : productid,
"storeid" : "(storeId)",
"userid" : UserDefaults.standard.value(forKey: AppStrings.userid) ?? ""]


let baseParams = Utility.appendBaseParams(toDict: paramDict as! [String : String])

NetworkResponseManager.getDataFromUrl(url: addFriendsBaseUrl, parameters: baseParams as! [String : String] , completionHandler: {
[weak self]
(response, error) in
self?.listBool = false
if (error == nil) {

if let responseDict = response {

let responseDict = AddToWishlistModel(JSON(responseDict))
self?.removeLoading(view: self?.view, random: self?.removeRandom)
if responseDict.status == 1
{
self?.myWishlistArry?.remove(at: indexPath.row)
self?.myWishListTableView.deleteRows(at: [indexPath], with: .right)
} else {
self?.showToast(message: AppLocalString.OOPS_TEXT.localized())
}
}
} else {
self?.showToast(message: AppLocalString.OOPS_TEXT.localized())
}
})
}

其他表格视图代码

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

return self.myWishlistArry?.count ?? 0
}

func numberOfSections(in tableView: UITableView) -> Int {
return 1
}

现在,这段代码是第一次工作,但如果试图删除另一个表示索引超出范围的项,则会导致崩溃。考虑列表中是否有四个项目T1、T2、T3和T4第一次如果我删除T2项目indexPath.row的值现在是1,项目和行被删除如果我删除另一个项目,比如T4indexPath.rrow的值变成3而不是2为什么会发生这种情况,为什么索引路径不更新?

根据整个代码,问题似乎是clojure

如果在cellForRowAt的clojure中调用它,则indexpath不同(设置为调用cellForRowAt时正确的值(。你应该根据愿望清单项目的id进行删除(当项目被删除时,这不会改变(。

例如,创建一个类似于的方法

func deleteWish(productId: string) {
for i in myWishlistArry ?? [] {
let product = myWishlistArry[i]
if let product.productId == productId {
myWishlistArry?.remove(at: i)
myWishListTableView.deleteRows(at: [IndexPath(row: i, 0)], with: .right)
}
}
}

并调用clojuredeleteWish(productId: idOfDeletedProduct)

问题是索引路径被捕获,并且在单元格顺序更改后不会更新。

解决方案:

在单元格中声明关闭也通过单元格

var closureForRemoveBtn : ((UITableViewCell, String, String) -> Void)?

并称之为

closureForRemoveBtn?(self, productId, storeId)

cellForRow中,从实际小区获取索引路径

myWishlistCell.closureForRemoveBtn = {
[weak self]
(actualCell, productId, storeid) in
let actualIndexPath = tableView.indexPath(for: actualCell)!
self?.callAlertViewForRemoved(productid: productId, storeId: storeid, indexPath: actualIndexPath)
}

或者更简单的

var closureForRemoveBtn : ((UITableViewCell) -> Void)?
///
closureForRemoveBtn?(self)
///
myWishlistCell.closureForRemoveBtn = {
[weak self] actualCell in
let actualIndexPath = tableView.indexPath(for: actualCell)!
self?.callAlertViewForRemoved(productid: actualCell.productId, storeId: actualCell.storeid, indexPath: actualIndexPath)
}

相关内容

  • 没有找到相关文章

最新更新