一些tableview单元格内容在滚动(swift)后消失

时间:2017-07-17 13:38:30

标签: ios swift uitableview tableview cell

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

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
}

及以下是选择一个动画的单元格的方法,该动画我希望最终状态保持在tableview单元格上。

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

这是您选择单元格时的样子照片:

enter image description here

这是向下滚动后同一单元格的照片,因此不在视图中然后向后滚动:

enter image description here

这里显然有些错误 - 我补充说"触及" boolean到自定义表视图单元类,假设可能正在重新绘制单元格,并且无法知道它是否应该将该星形设置为动画,因此它被认为是零,但该修复程序似乎没有工作(也许我在做某些事情,但却错误地实施了它?)

如果你有任何线索,请告诉我这里发生了什么!非常感谢!!!

2 个答案:

答案 0 :(得分:2)

您的代码存在各种问题。在tableView(_:cellForRowAt:)方法中,您应该致电dequeueReusableCell(withIdentifier:for:)

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

有无数关于如何使用表视图的教程。你需要去做一些阅读。

答案 1 :(得分:0)

将此作为一个循序渐进的过程提及答案

1)为您的数据创建结构

$^I

2)使用这些Profile元素填充数组。所以最后你有一系列的个人资料。

3)使用此数组填充tableview,每个单元格元素从Profile对象获取数据。

4)在你的cellForRowAt方法中使用dequeueReusableCell(withIdentifier:for :)来初始化你的单元格并赋值

5)如果对于该特定的配置文件,isTouched为true则显示

struct Profile {
var personName: String?
var photoURL: String?
var rank: String?
var isTouched: Bool?

// add init method and stuff
}

否则将其设为false

6)在didSelectRow中,获取indexpath.row然后在您的配置文件数组中根据您对该特定行的需求设置Profile.isTouched = true / false并相应地切换。使用新的配置文件对象更新配置文件数组。

7)刷新tableview。