iOS Swift TableviewCell проблема

ios swift uitableview

84 просмотра

2 ответа

У меня странная проблема с ячейкой tableView.

когда я прокручиваю tableView и ячейка исчезает и снова возвращается к ячейке, я понимаю, что tableView добавляет похожую ячейку точно в ячейку.

например посмотрите на картинку. 3 точных текста добавьте друг на друга.

введите описание изображения здесь

Функция 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()
    })
}

в чем моя проблема?

Спасибо, парни.

Автор: MohammadReza Источник Размещён: 08.11.2019 11:12

Ответы (2)


0 плюса

Решение

Вы допустили классическую ошибку при использовании ячеек iOS. (Я учитель, поэтому часто вижу подобные ошибки ... не волнуйтесь ..)

Некоторые соображения: 1) НИКОГДА не добавляйте метку в ячейку. При этом очень часто ячейка используется повторно, здесь остается предыдущий ярлык и добавляется новый ярлык.

2) так как метка прозрачна, вы увидите, что весь текст перекрывается.

3) Вы теряете память, так как никто не отсоединит / выпустит ярлыки.

так что путь может быть:

A) Простой для простого случая использовать TAGS, как Apple делала в старые времена клеток .. (код I

сделать некоторые определения:

let TEXT_TAG = 2000

добавить метку, если ее нет, если она есть, получить ее. 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)
    }        

Б) сделать кастомную клетку ...

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"
Автор: ingconti Размещён: 20.08.2016 01:56

0 плюса

Я понял вашу проблему, вы получаете ячейку из пула многократного использования tableView. Первая проблема, если вы хотите изменить UITableViewCell View, вам нужно создать его класс сына. Я получаю функцию, чтобы исправить это. Я использую Stackoverflow в первый раз, я не знаю, где я могу разместить свой код, поэтому я пишу его под этим предложением.

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

И затем, используя ваш код, он должен вам помочь.

Автор: chouheiwa Размещён: 20.08.2016 11:46
Вопросы из категории :
32x32