我正在使用下面的代码,其中我使用了两个单元格,一个单元格是固定的,另外一个单元格根据检索到的数据在表视图中重复出现,有时它可以正常工作,但有时却会出错
致命错误:索引超出范围
在
cell.set(post:posts [indexPath.row-1])
我应该如何消除此错误?
override func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// print(posts)
return scores1.count + posts.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
if indexPath.row == 0 && scores1.count == 1 {
let cell = tableView.dequeueReusableCell(withIdentifier: "ScoresCell") as! ScoresCellInHomeScreen
cell.set(scores: scores1[indexPath.row])
return cell
} else if posts.count > (indexPath.row - 1 ) {
let cell = tableView.dequeueReusableCell(withIdentifier: "postCell", for: indexPath) as! PostTableViewCell
cell.btnComment.tag = indexPath.row - 1
cell.btnComment.addTarget(self, action: #selector(toComments(_:)), for: .touchUpInside)
cell.favoritebutton.tag = indexPath.row - 1
cell.favoritebutton.addTarget(self, action: #selector(favupdate(_:)), for: .touchUpInside)
cell.set(post: posts[indexPath.row - 1 ])
return cell
} else {
return UITableViewCell()
}
}
答案 0 :(得分:1)
从
更改条件else if posts.count > (indexPath.row - 1 )
到
else if ((posts.count > (indexPath.row - 1 )) && indexPath.row > 0)
答案 1 :(得分:1)
尝试:
if indexPath.row == 0 && scores1.count == 1 {
let cell = tableView.dequeueReusableCell(withIdentifier: "ScoresCell") as! ScoresCellInHomeScreen
cell.set(scores: scores1[indexPath.row])
return cell
} else if indexPath.row > 0 {
if posts.count > (indexPath.row - 1 ) {
let cell = tableView.dequeueReusableCell(withIdentifier: "postCell", for: indexPath) as! PostTableViewCell
cell.btnComment.tag = indexPath.row - 1
cell.btnComment.addTarget(self, action: #selector(toComments(_:)), for: .touchUpInside)
cell.favoritebutton.tag = indexPath.row - 1
cell.favoritebutton.addTarget(self, action: #selector(favupdate(_:)), for: .touchUpInside)
cell.set(post: posts[indexPath.row - 1 ])
return cell
} else {
return UITableViewCell()
}
}
您还可能希望在添加目标之前将其删除,因为它可能会重用先前的目标,这会给您带来不良的结果。
答案 2 :(得分:0)
您的indexPath.row
从0开始于第一个单元格。
如果在您的应用程序中有一个实例,您获得indexPath.row = 0
和scores1.count != 1
,则将输入带有indexPath.row = 0
因此,在这种情况下,如果您执行posts[indexPath.row - 1]
,则将访问具有负索引的数组,这将导致崩溃。