以下是我的自定义单元格类:

class AthleteTableViewCell: UITableViewCell {

var myLabel1: UILabel!
var myLabel2: UILabel!
var profile: UIImageView!
var star = StarButton()
var touched = false

required init(coder aDecoder: NSCoder) {
    fatalError("init(coder:)")
}

override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
    super.init(style: style, reuseIdentifier: reuseIdentifier)

    let gap : CGFloat = 10
    let labelHeight: CGFloat = 30
    let labelWidth: CGFloat = 150
    let lineGap : CGFloat = 5
    let label2Y : CGFloat = gap + labelHeight + lineGap


    myLabel1 = UILabel()
    myLabel1.frame = CGRect(x: gap, y: gap, width: labelWidth, height: labelHeight)
    myLabel1.textColor = UIColor.black
    contentView.addSubview(myLabel1)

    myLabel2 = UILabel()
    myLabel2.frame = CGRect(x: gap * 5, y: label2Y, width: labelHeight, height: labelHeight)
    myLabel2.textColor = UIColor.white
    myLabel2.textAlignment = .center
    myLabel2.backgroundColor = UIColor.flatMint()
    myLabel2.layer.cornerRadius = 15.0
    myLabel2.clipsToBounds = true
    contentView.addSubview(myLabel2)

    profile = UIImageView()
    profile.image = UIImage()
    profile.frame = CGRect(x: bounds.width - gap, y: bounds.height / 2, width: bounds.height * 1.25, height: bounds.height * 1.25)
    profile.layer.cornerRadius = (bounds.height * 1.25) / 2
    profile.layer.masksToBounds = true
    contentView.addSubview(profile)

    if (touched != false) {
        star.isSelected = true
        star.frame = CGRect(x: gap, y: label2Y, width: labelHeight, height: labelHeight)
        contentView.addSubview(star)
    } else {
        star.frame = CGRect(x: gap, y: label2Y, width: labelHeight, height: labelHeight)
        contentView.addSubview(star)
        star.isEnabled = true
    }
}

}

下面是创建我的单元格的方法:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = AthleteTableViewCell(style: UITableViewCellStyle.default, reuseIdentifier: "myCell")

    cell.myLabel1.text = "\(myArray[indexPath.row])"
    cell.myLabel1.textColor = UIColor.white
    cell.myLabel2.isHidden = true

    cell.profile.image = UIImage(named: cell.myLabel1.text!)

    cellArray.append(cell)

    if (cell.touched) {
        cell.star.isSelected = true
    } else {
        cell.star.isOpaque = true
    }

    cell.backgroundColor = UIColor(white: 1, alpha: 0.2)

    return cell
}

下面是选择跳出动画的单元格的方法,我希望动画的最终状态保持在表格单元格上。
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    makeSelection(tableView, didSelectRowAt: indexPath)
}

func makeSelection(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let cell = tableView.cellForRow(at: indexPath) as! AthleteTableViewCell
    cell.selectionStyle = UITableViewCellSelectionStyle.none

    if(selectionArray.contains(myArray.object(at: indexPath.row))) {
        //Popping selection off of the stack and updating all labels
        updateLabels(tableView: tableView)
        selectionArray.remove(myArray[indexPath.row])
        cell.star.isFavorite = false
        cell.myLabel2?.isHidden = true
        //need to somehow implement all of the rank labels decreasing by one if I deselect someone
        cell.touched = false
        //updateLabels(tableView: tableView)
    } else {
        selectionArray.add(myArray[indexPath.row])
        cell.touched = true
        let rank = selectionArray.count
        cell.myLabel2.isHidden = false
        cell.myLabel2?.text = "\(rank)"
        cell.star.isFavorite = true
    }
}

这是选择单元格时的外观照片:

ios - 滚动(快速移动)后,某些tableview单元格内容消失-LMLPHP

这是向下滚动后在同一单元格中的照片,从而使它不可见,然后向后滚动:

ios - 滚动(快速移动)后,某些tableview单元格内容消失-LMLPHP

显然这里有些不对劲-我在自定义表格视图单元格类中添加了“感动”布尔值,其前提是可能正在重绘单元格,并且没有办法知道是否应该使该星星处于动画状态。它被认为是nil,但是该修复似乎无效(也许我在做某事,但是实施不正确?)

让我知道您是否有任何提示!非常感谢!!!

最佳答案

您的代码有很多问题。在tableView(_:cellForRowAt:)方法中,您应该调用dequeueReusableCell(withIdentifier:for:)

您不应尝试从单元格读取数据以加载内容。您应该将状态数据保存到某种数据模型中。数组适用于具有单个节的表视图,数组数组适用于分段的表视图。

关于如何使用表格视图的教程不计其数。你需要去读书。

10-07 19:49
查看更多