iOS Swift TableviewCell问题

时间:2016-08-20 10:53:59

标签: ios swift uitableview

我对tableView单元格有一个奇怪的问题。

当我滚动tableView并且单元格消失并再次返回到单元格时,我理解tableView在单元格上添加了类似的单元格。

例如看图片。 3个确切的文字互相添加。

enter image description here

cellForRowAtIndexPath 功能

let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as UITableViewCell

    if indexPath.row == 0 {

        let reviewNumber = UILabel()

        if (self.book.review_count == 0) {
            reviewNumber.text = "\(self.lang.book["no_review"]!)"
        }
        if (self.book.review_count > 0) {
            reviewNumber.text = "\(self.book.review_count!) \(self.lang.general["review"]!)"
        }

        reviewNumber.textAlignment = .Right
        reviewNumber.font = UIFont(name: "Vazir", size: 14)
        reviewNumber.numberOfLines = 0
        reviewNumber.translatesAutoresizingMaskIntoConstraints = false
        reviewNumber.textColor = UIColor.grayColor()

        cell.contentView.addSubview(reviewNumber)




        let voteIcon = UIImageView()
        voteIcon.image = UIImage(named: "vote-icn")
        voteIcon.translatesAutoresizingMaskIntoConstraints = false
        cell.contentView.addSubview(voteIcon)
        cell.contentView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-[v0(24)]-|",options: [],metrics: nil,views: ["v0" : voteIcon]))


        let reviewIcon = UIImageView()
        reviewIcon.image = UIImage(named: "review-icn")
        reviewIcon.translatesAutoresizingMaskIntoConstraints = false
        cell.contentView.addSubview(reviewIcon)
        cell.contentView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-[v0(24)]-|",options: [],metrics: nil,views: ["v0" : reviewIcon]))


        let voteNumber = UILabel()
        voteNumber.text = " ۴.۵ از ۱۶۵۴رأی"
        voteNumber.textAlignment = .Left
        voteNumber.font = UIFont(name: "Vazir", size: 14)
        voteNumber.numberOfLines = 0
        voteNumber.translatesAutoresizingMaskIntoConstraints = false
        voteNumber.textColor = UIColor.grayColor()

        cell.contentView.addSubview(voteNumber)


        cell.contentView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-3-[v0]-3-|",options: [],metrics: nil,views: ["v0" : reviewNumber]))
        cell.contentView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-3-[v0]-3-|",options: [],metrics: nil,views: ["v0" : voteNumber]))
        cell.contentView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-35-[v0]-8-[v1(25)]",options: [],metrics: nil,views: ["v0" : voteNumber, "v1" : voteIcon, "v2" : reviewNumber, "v3" : reviewIcon]))

        cell.contentView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:[v2]-8-[v3(25)]-35-|",options: [],metrics: nil,views: ["v0" : voteNumber, "v1" : voteIcon, "v2" : reviewNumber, "v3" : reviewIcon]))



    }

    if indexPath.row == 1 {

        let userBookStatusButtn = UIButton(type: .Custom)
        userBookStatusButtn.setTitle("خواهم خواند", forState: .Normal)
        userBookStatusButtn.alpha = 0.2
        userBookStatusButtn.titleLabel?.font = UIFont(name: "Vazir", size: 14)
        userBookStatusButtn.setTitleColor(UIColor.whiteColor(), forState: .Normal)
        //            userBookStatusButtn.setImage(UIImage(named: "vote-icn"), forState: .Normal)
        userBookStatusButtn.translatesAutoresizingMaskIntoConstraints = false

        userBookStatusButtn.backgroundColor = UIColor(red:0.0/256.0 ,green:150.0/256.0, blue:136.0/256.0 ,alpha:1 )

        cell.contentView.addSubview(userBookStatusButtn)

        cell.contentView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-20-[v0(48)]-20-|",options: [],metrics: nil,views: ["v0" : userBookStatusButtn]))
        cell.contentView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-35-[v0]-35-|",options: [],metrics: nil,views: ["v0" : userBookStatusButtn]))


    }

    if indexPath.row == 2 {

        let topBorder = UIView()
        topBorder.translatesAutoresizingMaskIntoConstraints = false
        topBorder.backgroundColor = UIColor(white: 0.5, alpha: 0.5)
        cell.contentView.addSubview(topBorder)

        let bottomBorder = UIView()
        bottomBorder.translatesAutoresizingMaskIntoConstraints = false
        bottomBorder.backgroundColor = UIColor(white: 0.5, alpha: 0.5)
        cell.contentView.addSubview(bottomBorder)


        let paragraphStyle = NSMutableParagraphStyle()
        paragraphStyle.lineSpacing = 5
        paragraphStyle.baseWritingDirection = .RightToLeft

        guard let descriptionStr = self.book.description else {return cell}
        let attrString = NSMutableAttributedString(string: descriptionStr)
        attrString.addAttribute(NSParagraphStyleAttributeName, value:paragraphStyle, range:NSMakeRange(0, attrString.length))


        let description = UILabel()
        description.attributedText = attrString
        description.textAlignment = .Justified
        description.font = UIFont(name: "Vazir", size: 14)
        description.numberOfLines = 0
        description.translatesAutoresizingMaskIntoConstraints = false

        description.lineBreakMode = NSLineBreakMode.ByWordWrapping

        cell.contentView.addSubview(description)



        let title = UILabel()
        title.text = "\(self.lang.book["summery"]!)"
        title.alpha = 0.2
        title.textAlignment = .Center
        title.font = UIFont(name: "Vazir-Bold", size: 16)
        title.translatesAutoresizingMaskIntoConstraints = false
        cell.contentView.addSubview(title)



        cell.contentView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-[v0]-|",options: [.AlignAllCenterX],metrics: nil,views: ["v0" : title]))
        cell.contentView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-20-[v0]-20-|",options: [],metrics: nil,views: ["v0" : description]))

        cell.contentView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-8-[v1]-44-[v0]",options: [],metrics: nil,views: ["v0" : description,"v1" : title ]))
        cell.contentView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:[v0]-8-|",options: [],metrics: nil,views: ["v0" : description,"v1" : title ]))



    }
    cell.textLabel?.text = nil



    return cell

}

我从子文件中获取数据 Alamofire 和reloadData:

func tableRefresh()
{
    dispatch_async(dispatch_get_main_queue(), {
        self.bookDetailTableView.reloadData()
    })
}

我的问题是什么?

谢谢你们。

2 个答案:

答案 0 :(得分:0)

我得到你的问题,你从tableView可重用池获取单元格。第一个问题,如果你想要更改UITableViewCell View,你需要创建一个它的子类。我得到一个函数来修复它。 我第一次使用Stackoverflow,我不知道在哪里可以放入我的代码,所以我用这句话写下来。

let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as UITableViewCell
for let item in cell.contentView.subviews {
        item.removeFromSuperView();
    }

然后使用你的代码,它可以帮助你。

答案 1 :(得分:0)

使用iOS手机时出现了经典错误。 (我是老师,所以我经常看到这种错误......不要担心......)

一些注意事项: 1)切勿向单元格添加标签。这样做,很快就会重复使用一个单元格,之前的标签会留在这里,并添加一个新标签

2)由于标签是透明的,您将看到所有文本重叠..

3)你正在泄漏记忆,因为没有人会分离/释放标签。

所以方式可以是:

A)简单的简单案例 使用TAGS,正如苹果公司在过去的细胞时所做的那样。 (代码i

制定一些定义:

let TEXT_TAG = 2000

添加标签(如果不存在),如果存在则获取vi TAG:

let cell = tableView.dequeueReusableCell(withIdentifier: REUSE, for: indexPath ) 

let text = "my text..."
    if let label = cell.viewWithTag(TEXT_TAG) as? UILabel{
        label.text = text
    }else{
        let frame = CGRect(x: 100, y: 20, width: 50, height: 50)
        let label = UILabel(frame: frame)
        label.text = text
        cell.addSubview(label)
    }        

B)制作一个自定义单元格......

class CustomViewCell: UITableViewCell {

    var label: UILabel?

    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
        let frame = CGRect(x: 100, y: 20, width: 50, height: 50)
        let label = UILabel(frame: frame)
        self.addSubview(label)
    }
控制器中的

只是:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: REUSE, 
      for: indexPath ) as! CustomViewCell

        cell.label = "my text"