Использование расширения для создания торговых точек ведет себя странно в UITableViewCell - PullRequest
0 голосов
/ 26 декабря 2018

вот мой класс ячеек, когда я использую расширение для создания розетки.и установка значения с помощью метода didSet путем проверки индекса строки.когда я прокручиваю значения меняются странным образом.

import UIKit

class MyLabelCell: BaseTableViewCell {

    override func setcellUI() {
        setbuttonUI()
    }

    var rowIndex: Int! {
        didSet {
            switch rowIndex {
            case 2:
                myLabel.text = "2222"
            case 9:
                myLabel.text = "9999"
            default:
                myLabel.text = "0000"
            }
        }
    }
}

private var myLabel: UILabel = UILabel()
extension MyLabelCell {
    fileprivate func setbuttonUI() {

        let fontScaller = deviceWidth/375

        myLabel = UILabel()
        myLabel.translatesAutoresizingMaskIntoConstraints = false
        myLabel.textAlignment = .center
        myLabel.font = UIFont(name: "Helvetica-Light", size: 15 * fontScaller)
        myLabel.minimumScaleFactor = 0.2
        myLabel.adjustsFontSizeToFitWidth = true
        myLabel.text = "BUTTON"
        addSubview(myLabel)

        let buttonLeft = deviceWidth/25
        let buttonRight = -deviceWidth/25
        let buttonHeight = deviceHeight/14.82

        let buttonlabelConstraints = [myLabel.leftAnchor.constraint(equalTo: leftAnchor, constant: buttonLeft),
                                      myLabel.rightAnchor.constraint(equalTo: rightAnchor, constant: buttonRight),
                                      myLabel.centerYAnchor.constraint(equalTo: centerYAnchor),
                                      myLabel.heightAnchor.constraint(equalToConstant: buttonHeight)]
        NSLayoutConstraint.activate(buttonlabelConstraints)
        myLabel.layer.masksToBounds = false
        myLabel.layer.cornerRadius = 5
        myLabel.clipsToBounds = true
    }
}

Тогда Если я создаю Outlets без использования расширений, то это работает правильно.он не повторяет значения и не действует странно.ниже мой код.

import UIKit

class MyLabelCell: BaseTableViewCell {

    let buttonLabel: UILabel = {
        let label = UILabel()
        label.translatesAutoresizingMaskIntoConstraints = false
        label.textAlignment = .center
        return label
    }()

    override func setcellUI() {
        addSubview(buttonLabel)
        let buttonLeft = deviceWidth/25
        let buttonRight = -deviceWidth/25
        let buttonHeight = deviceHeight/14.82

        let buttonlabelConstraints = [buttonLabel.leftAnchor.constraint(equalTo: leftAnchor, constant: buttonLeft),
                                      buttonLabel.rightAnchor.constraint(equalTo: rightAnchor, constant: buttonRight),
                                      buttonLabel.centerYAnchor.constraint(equalTo: centerYAnchor),
                                      buttonLabel.heightAnchor.constraint(equalToConstant: buttonHeight)]
        NSLayoutConstraint.activate(buttonlabelConstraints)
    }

    var rowIndex: Int! {
        didSet {
            switch rowIndex {
            case 2:
                buttonLabel.text = "22222"
            case 3:
                buttonLabel.text = "33333"
            case 4:
                buttonLabel.text = "44444"
            case 7:
                buttonLabel.text = "77777"
            case 9:
                buttonLabel.text = "99999"
            default:
                buttonLabel.text = "00000"
            }
        }
    }
}

** разве не хорошо использовать расширение для создания торговых точек ???** и почему это так странно.если бы кто-то мог это объяснить, то это было бы здорово.надеюсь, что ваша помощь с этим, чтобы понять.Спасибо всем, ура!и счастливого запоздалого рождества.

1 Ответ

0 голосов
/ 26 декабря 2018

это потому, что во втором коде каждый раз при создании ячейки здесь создается новая метка для каждой ячейки

 let buttonLabel: UILabel = {
    let label = UILabel()
    label.translatesAutoresizingMaskIntoConstraints = false
    label.textAlignment = .center
    return label
}()

, тогда как в вашем коде расширения вы создаете только один раз и присваиваете его ячейке, а UILable являетсятип ссылки вы получаете странное поведение

в этой строке: private var myLabel: UILabel = UILabel()

...