使用swift创建tableview中cell无法复用,大家帮忙看看

龙炎
  • 106

我用swift自定义了一个cell,同时复写了init方法,但是每回调用的时候,都不走

if cell.isEqual(nil) {

            cell = WYLClockDetailCell.init(style: .default, reuseIdentifier: "cell", tag:indexPath.row)

}

原因是每回在dequeueReusableCell的时候,就莫名的调用了

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

        super.init(style: style, reuseIdentifier: reuseIdentifier)

}

而我真正其实是希望进入自己复写的init方法,如下

init(style: UITableViewCellStyle, reuseIdentifier: String?, tag: Int) {

        super.init(style: style, reuseIdentifier: reuseIdentifier)

        self.backgroundColor = UIColor.white
        upInfoCell()

}

我的完整代码:
tableViewCell

class WYLClockDetailCell: UITableViewCell {

    var cellTitle: UILabel?
    
    override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
        //每次都进入这个
        super.init(style: style, reuseIdentifier: reuseIdentifier)

    }
    
    init(style: UITableViewCellStyle, reuseIdentifier: String?, tag: Int) {
        //而我希望进入这个方法
        super.init(style: style, reuseIdentifier: reuseIdentifier)

        self.backgroundColor = UIColor.white
        upInfoCell()

    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }

}

tableview的创建方法:

override func viewDidLoad() {
        
        super.viewDidLoad()

        dataArray = ["内容","日期","时间","是否提前","重复","铃声","细节"]
        
        let tableView:UITableView = UITableView.init()
        tableView.delegate = self;
        tableView.dataSource = self;
        tableView.backgroundColor = UIColor.init(red: CGFloat.init(arc4random()%255)/255.0, green: CGFloat.init(arc4random()%255)/255.0, blue: CGFloat.init(arc4random()%255)/255.0, alpha: 1)
        tableView.bounces = false
        tableView.separatorStyle = .none;
        self.view.addSubview(tableView)
        
        tableView.register(WYLClockDetailCell.self, forCellReuseIdentifier: "cell")
        
        weak var weakSelf = self
        
        tableView.snp.makeConstraints { (maker) in
        
            maker.bottom.equalTo(weakSelf!.view).offset(-kRealValue()*5.5)
            maker.left.equalTo(weakSelf!.view).offset(0)
            maker.right.equalTo(weakSelf!.view).offset(0)
            maker.height.equalTo(46*dataArray!.count)
            
        }
        
        self.view.backgroundColor = UIColor.init(red: CGFloat.init(arc4random()%255)/255.0, green: CGFloat.init(arc4random()%255)/255.0, blue: CGFloat.init(arc4random()%255)/255.0, alpha: 1)
        
        tableView.reloadData()
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
        var cell:WYLClockDetailCell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! WYLClockDetailCell
        
        if cell.isEqual(nil) {

            cell = WYLClockDetailCell.init(style: .default, reuseIdentifier: "cell", tag:indexPath.row)

        }
        
        return cell
        
}

还有一个问题是整个tableview都无法复用了,每次都会直接从dequeueReusableCell直接生成一个cell,请问哪里出了问题,怎么解决呢

回复
阅读 2.9k
1 个回答
✓ 已被采纳

去掉register,因为register会直接init一个cell出来

tableView.register(WYLClockDetailCell.self, forCellReuseIdentifier: "cell")

要用 ? 而不是 ! 因为!会直接强制出一个cell

var cell = tableView.dequeueReusableCell(withIdentifier:idf) as? WYLClockDetailCell
        
        if cell == nil {
            cell = WYLClockDetailCell.init(style: .default, reuseIdentifier: idf, tag: indexPath.row)
        }
宣传栏