滚动后再打开,视图在UITableViewCell中重新出现

时间:2017-08-04 07:36:05

标签: ios iphone swift uitableview swift3

我有一个包含2个部分的UITableView。在第一部分中,我不希望我创建的UIView出现在左侧。它在最初加载时工作正常,但当它离开屏幕并再次重新启动时会重新出现。

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath)
{
    let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier") as! ATableCell;
    cell.delegate = self;

    if (indexPath.section == 1)
    {
        // let height = cell.bounds.size.height;
        let height = 100;

        let turnsView = UIView(frame: CGRect(x: 0, y: 0, width: 10, height: height));
        turnsView.backgroundColor = UIColor.purple;

        cell.addSubview(turnsView);
    }
    else
    {
        let height = 100;

        let turnsView = UIView(frame: CGRect(x: 0, y: 0, width: 10, height: height));
        turnsView.backgroundColor = UIColor.clear;

        cell.addSubview(turnsView);
    }

    // Configure the cell...

    cell.backgroundColor = UIColor.clear;
    cell.textLabel?.text = "texting";
    cell.detailTextLabel?.text = "testing";
}

我不希望紫色视图出现在第一部分中。

4 个答案:

答案 0 :(得分:1)

使用时

tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell

你应该使用每个“if”条件及其“else”子句,因为当你滚动它时,它会重新使用导致它重新出现的单元格。因此,如果你不写其他条件,如果条件变为假,它将使用旧的单元格数据。

答案 1 :(得分:0)

始终避免将子视图添加到cellForRow中的单元格。您需要了解单元格是否被重用,当您在cellForRow中添加subView时,每次都不会删除子视图。因此,如果单元格由于滚动打开和关闭而出现10次,则会将10个子视图添加到重用的单元格中。

在你的情况下,同样的事情正在发生。我建议你在XIB / Prototype单元格中添加视图。给它一个引用并在cellForRow中更改其backgroundColor属性。

或者如果您不使用XIB或原型单元格,请在单元格类的init方法中添加子视图。

var turnsView = UIView()

override init(style: UITableViewCellStyle, reuseIdentifier: String!) {
    super.init(style: style, reuseIdentifier: reuseIdentifier)
    turnsView = UIView(frame: CGRect(x: 0, y: 0, width: 10, height: 100)) 
    self.contentView.addSubview(turnsView)

}

答案 2 :(得分:0)

这应该适合你:

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath)
{
    let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier") as! ATableCell;
    cell.delegate = self;

    //Remove subviews before adding again
    if let purpleV = cell.viewWithTag(1) {
        purpleV.removeFromSuperview()
    }
    if let purpleV = cell.viewWithTag(2) {
        purpleV.removeFromSuperview()
    }

    if (indexPath.section == 1)
    {
        // let height = cell.bounds.size.height;
        let height = 100;

        let turnsView = UIView(frame: CGRect(x: 0, y: 0, width: 10, height: height));
        turnsView.tag = 1
        turnsView.backgroundColor = UIColor.purple;

        cell.addSubview(turnsView);
    }
    else
    {
        let height = 100;

        let turnsView = UIView(frame: CGRect(x: 0, y: 0, width: 10, height: height));
        turnsView.tag = 2
        turnsView.backgroundColor = UIColor.clear;

        cell.addSubview(turnsView);
    }

    // Configure the cell...

    cell.backgroundColor = UIColor.clear;
    cell.textLabel?.text = "texting";
    cell.detailTextLabel?.text = "testing";
}

阅读dequeuereusablecell方法的文档以澄清。

答案 3 :(得分:0)

这样做很好:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier", for: indexPath)
    // Config the cell...
    if let turnsCell as? ATableCell {
        turnsCell.turnsColor = (indexPath.section == 1 ? UIColor.purple : UIColor.clear)
    }

    cell.textLabel?.text = "texting"
    cell.detailTextLabel?.text = "testing"

    return cell
}

class ATableCell: UITableViewCell {
    var turnsView = UIView()

    var turnsColor: UIColor {
        get {
            return self.turnsView.backgroundColor
        }
        set {
            self.turnsView.backgroundColor = newValue
        }
    }

    override func awakeFromNib() {
        super.awakeFromNib()
        // let height = self.bounds.size.height;
        let height = 100;

        turnsView.frame = CGRect(x: 0, y: 0, width: 10, height: height)
        self.contentView.addSubview(turnsView)
        self.backgroundColor = UIColor.clear
    }
}