有时会收到错误,否则会正常工作,如何确保消除错误?

时间:2019-12-05 09:57:49

标签: ios swift uitableview

我正在使用下面的代码,其中我使用了两个单元格,一个单元格是固定的,另外一个单元格根据检索到的数据在表视图中重复出现,有时它可以正常工作,但有时却会出错

  

致命错误:索引超出范围

  

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()
        }
    }

3 个答案:

答案 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 = 0scores1.count != 1,则将输入带有indexPath.row = 0

的else实例。

因此,在这种情况下,如果您执行posts[indexPath.row - 1],则将访问具有负索引的数组,这将导致崩溃。