每当我一次又一次按下“喜欢”和“心形”按钮时,它将使应用程序崩溃并说“致命错误:索引超出范围”。
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))")
}
}
}
在这里,我正在使用观察器,从sender.tag中获取index.row,当我单击“喜欢”或“心脏”按钮时,该API就会触发并给出响应。当我单击的次数超过App崩溃时。
答案 0 :(得分:-1)
为什么要如此成功?
self.activityArray.removeAll()
下次调用此函数时,将索引到数组中
“ activity_id”:activityArray [sender.tag] .id!
但是根据您显示的代码,它将为空
如果activityArray
正在更改,并且似乎用于表行,则需要调用tableView.reloadData()
来清空表
编辑-看到更新后的代码。
您错了几件事
所以
self.activityArray.removeAll()
中的行liked(sender:)
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-deleterows和https://developer.apple.com/documentation/uikit/uitableview/1614879-insertrows和https://developer.apple.com/documentation/uikit/uitableview/2887515-performbatchupdates的苹果文档,并观看本教程:{{3 }}
如果您采用这种方式-尤其是当您不重新加载整个表格时-iOS的工作量将大大减少,并且可以制作出更好的默认动画。