gpt4 book ai didi

ios - fatal error : Index out of range, 由于反复按赞和心形按钮

转载 作者:行者123 更新时间:2023-11-28 09:21:51 25 4
gpt4 key购买 nike

每当我一次又一次地按赞和心形按钮时,应用程序就会崩溃并显示“ fatal error :索引超出范围”。

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) - > Int {
return activityArray.count
}


func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) - > UITableViewCell {

let cell = tableView.dequeueReusableCell(withIdentifier: "activityCell") as!StreamActivityTableViewCell

cell.likeButton.tag = indexPath.row
print("....\(cell.likeButton.tag)")
cell.heartButton.tag = indexPath.row
cell.likeButton.addTarget(self, action: #selector(liked(sender: )),
for: .touchUpInside)
cell.heartButton.addTarget(self, action: #selector(loved(sender: )),
for: .touchUpInside)

return cell

}




@objc func liked(sender: UIButton) {
let likebutton = sender.tag

print("---- \(likebutton) ... \(sender.tag)")
let headers = ["Authorization": "Bearer \(UserDefaults.standard.string(forKey: "
token ")!)"
]
let parameters: Parameters = [
"activity_id": activityArray[sender.tag].id!
]
print(parameters)
Alamofire.request(Constants.likedURL, method: .post, parameters: parameters, encoding: URLEncoding.default, headers: headers).validate().responseString {
response in
switch (response.result) {
case.success(_):
if (response.result.isSuccess) {
self.activityArray.removeAll()
self.activityShown()
}
case.failure(_):
print("Error message:\(response.error!.localizedDescription)")
let alert = UIAlertController(title: "Sorry", message: "\(response.error!.localizedDescription)", preferredStyle: UIAlertController.Style.alert)
alert.addAction(UIAlertAction(title: "OK", style: UIAlertAction.Style.default, handler: nil))
self.present(alert, animated: true, completion: nil)
break
}
}
}





func activityShown(){

SVProgressHUD.show()
let headers = ["Authorization":"Bearer \(UserDefaults.standard.string(forKey: "token")!)"]

Alamofire.request(Constants.activitiesURL,method: .get, encoding: JSONEncoding.default, headers: headers).responseJSON { response in

if response.result.isSuccess {
let ActivityJSON : JSON = JSON(response.result.value!)

let activityData = ActivityJSON["data"].arrayValue
let commentData = ActivityJSON["data"].arrayValue
for value in activityData {
let activity = Activity()
activity.name = value["name"].stringValue
activity.content = value["content"].stringValue
activity.published = value["published"].stringValue
activity.thumbnail = value["users"]["photo_thumb"].stringValue
activity.likesCount = value["likes_count"].intValue
activity.liked = value["liked"].intValue
activity.heartCount = value["heart_count"].intValue
activity.hearted = value["hearted"].intValue
activity.commentsCount = value["comments_count"].intValue
activity.commented = value["commented"].intValue
activity.id = value["id"].intValue
activity.currentID = value["users"]["user_id"].intValue
self.activityArray.append(activity)
SVProgressHUD.dismiss()

}

self.tableView.reloadData()
self.refreshControl.endRefreshing()
}
else {
print("Error \(String(describing: response.result.error))")
}
}
}

在这里,我使用 Observer,从 sender.tag 中获取 index.row,当我点击喜欢或心脏按钮时,该 API 会点击并给出响应。当我点击的次数超过 App 崩溃时。

最佳答案

为什么要在成功时执行此操作?

self.activityArray.removeAll()

下次调用这个函数时,索引到数组中

"activity_id": activityArray[sender.tag].id!

但根据您显示的代码,它将为空

如果 activityArray 正在改变并且看起来它被用于表格行,您需要调用 tableView.reloadData() 来清空表格

编辑——在看到更新后的代码之后。

你有一些问题

  1. 您在知道是否有新数据之前就删除了数据
  2. 您正在后台线程中重新加载数据——它始终需要在主线程中

所以,

  1. 删除 liked(sender:) 中的 self.activityArray.removeAll()
  2. 在此处添加该行
if response.result.isSuccess {
let ActivityJSON : JSON = JSON(response.result.value!)



//// HERE is where we know we are replacing the data
self.activityArray.removeAll()


let activityData = ActivityJSON["data"].arrayValue
let commentData = ActivityJSON["data"].arrayValue

最后

self.tableView.reloadData()
self.refreshControl.endRefreshing()

这段代码需要这样

DispatchQueue.main.async {
self.tableView.reloadData()
self.refreshControl.endRefreshing()
}

因为网络调用可能不会在主线程上完成,但所有 UI 代码都需要在主线程上。

编辑:正如 Claus 在他们的评论中提到的,更好的方法可能是使用 deleteRows/insertRows 和 performBatchUpdates

我建议您首先使用 reloadData() 进行所有操作——然后去阅读苹果文档中的 https://developer.apple.com/documentation/uikit/uitableview/1614960-deleterowshttps://developer.apple.com/documentation/uikit/uitableview/1614879-insertrowshttps://developer.apple.com/documentation/uikit/uitableview/2887515-performbatchupdates也许观看本教程:https://www.youtube.com/watch?v=MC4mDQ7UqEE

如果你这样做——尤其是当你没有重新加载整个表格时——iOS 将做更少的工作并制作更好的默认动画。

关于ios - fatal error : Index out of range, 由于反复按赞和心形按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56615338/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com