UITableView не показывает данные правильно в моей пользовательской ячейке UILabel и проблема повторного использования - PullRequest
0 голосов
/ 06 сентября 2018

Я создаю свой собственный класс ячеек и проектирую свой пользовательский интерфейс с кодом и ограничениями (у меня есть 2 UILabels, которые содержат мои данные в каждой строке). Я регистрирую свой класс customcell в основном viewController и загружаю данные в tableview.

Проблема в том, что одна из моих UILabels заполняется данными, но вторая не отображает данные, пока я не прокручиваю табличное представление или не щелкаю правой кнопкой мыши по этой строке. Смотрите изображения.

Перед прокруткой

enter image description here

После прокрутки

enter image description here

Вот мой код:

class ProjectDetailsCustomCell: UITableViewCell {
    var key   : String?
    var value : String?

    var keyContainerView : UIView = {
        var containerView = UIView()
        containerView.translatesAutoresizingMaskIntoConstraints = false
        containerView.backgroundColor = UIColor(red: 0.867, green: 0.867, blue: 0.867, alpha: CGFloat(1))
        return containerView
    }()

    var keyView : UILabel = {
        var keyTextView = UILabel()
        keyTextView.translatesAutoresizingMaskIntoConstraints = false
        keyTextView.font = UIFont(name: "IRANSansWeb", size: 13)
        keyTextView.textAlignment = .center
        return keyTextView
    }()

    var valueView : UILabel = {
        var valueTextView = UILabel()
        valueTextView.translatesAutoresizingMaskIntoConstraints = false
        valueTextView.textAlignment = .center
        valueTextView.font = UIFont(name: "IRANSansWeb", size: 12)
        //valueTextView.textColor = UIColor(red: 0.2, green: 0.2, blue: 0.2, alpha: CGFloat(1))
        return valueTextView
    }()

    override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
        self.addSubview(valueView)
        self.addSubview(keyContainerView)
        keyContainerView.addSubview(keyView)
        self.backgroundColor = UIColor.clear
        self.heightAnchor.constraint(equalToConstant: 42).isActive = true
        keyContainerView.rightAnchor.constraint(equalTo: self.rightAnchor).isActive = true
        keyContainerView.topAnchor.constraint(equalTo: self.topAnchor).isActive = true
        keyContainerView.widthAnchor.constraint(equalTo: self.widthAnchor, multiplier: 0.4).isActive = true
        keyContainerView.heightAnchor.constraint(equalToConstant: 40).isActive = true
        keyView.rightAnchor.constraint(equalTo: self.keyContainerView.rightAnchor).isActive = true
        keyView.topAnchor.constraint(equalTo: self.keyContainerView.topAnchor).isActive = true
        keyView.bottomAnchor.constraint(equalTo: self.keyContainerView.bottomAnchor).isActive = true
        keyView.widthAnchor.constraint(equalTo: self.keyContainerView.widthAnchor).isActive = true
        valueView.rightAnchor.constraint(equalTo: self.keyContainerView.leftAnchor).isActive = true
        valueView.leftAnchor.constraint(equalTo: self.leftAnchor).isActive = true
        valueView.topAnchor.constraint(equalTo: self.topAnchor).isActive = true
        valueView.widthAnchor.constraint(equalTo: self.widthAnchor, multiplier: 0.6).isActive = true
    }

    override func layoutSubviews() {
        super.layoutSubviews()

        if let key = key {
            keyView.text = key + value!
        }

        if let value = value {
            valueView.text = value
        }
    }

    override func awakeFromNib() {
        super.awakeFromNib()
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

вот мой исходный код данных, который заполняет массив данных:

for i in 0..<self.detailsArray.count {
            // Populate our array list with the real data and restart the tableview
            self.dict = self.detailsArray[i]
            self.dataList.append(DetailsCellData.init(key: "شماره سفارش", value: String(self.dict["Id"] as! Int)))
            self.dataList.append(DetailsCellData.init(key: "قیمت", value: self.dict["Price"] as? String))
            self.dataList.append(DetailsCellData.init(key: "زمان و تاریخ سفارش", value: self.dict["DateTime"] as? String))
            self.dataList.append(DetailsCellData.init(key: "نام و نام خانوادگی کارفرما", value: self.dict["UserInformation"] as? String))
            self.dataList.append(DetailsCellData.init(key: "شماره تماس کارفرما", value: self.dict["UserPhone"] as? String))
            self.dataList.append(DetailsCellData.init(key: "نام خدمات دهنده", value: self.dict["ContractorInformation"] as? String))
            self.dataList.append(DetailsCellData.init(key: "شماره خدمات دهنده", value: self.dict["ContractorPhone"] as? String))
            self.dataList.append(DetailsCellData.init(key: "تاریخ درخواست خدمات", value: self.dict["ServiceDate"] as? String))
            self.dataList.append(DetailsCellData.init(key: "ساعت درخواست خدمات", value: self.dict["ServiceTime"] as? String))
            self.dataList.append(DetailsCellData.init(key: "مقدار کار", value: (self.dict["WorkAmmount"] as? String)! + " " + (self.dict["WorkUnit"] as? String)!))
            self.dataList.append(DetailsCellData.init(key: "هزینه تخمینی (ریال)", value: self.dict["EstimatedPrice"] as? String))
            self.tableview.reloadData()

вот мой делегат табличного представления код

func numberOfSections(in tableView: UITableView) -> Int {
    return 1
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    if (dataList.count < 11){
        return 0
    } else {
        return dataList.count
    }
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableview.dequeueReusableCell(withIdentifier: "detailCustomCell", for: indexPath) as! ProjectDetailsCustomCell
    cell.key = self.dataList[indexPath.row].key
    cell.value = self.dataList[indexPath.row].value
    return cell
}

1 Ответ

0 голосов
/ 06 сентября 2018
override func layoutSubviews() {
    super.layoutSubviews()

    updateLayout()
}

func updateLayout() {
    if let key = key {
        keyView.text = key + value!
    }

    if let value = value {
        valueView.text = value
    }
}

попробуйте так, также добавьте сюда строку

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableview.dequeueReusableCell(withIdentifier: "detailCustomCell", for: indexPath) as! ProjectDetailsCustomCell
    cell.key = self.dataList[indexPath.row].key
    cell.value = self.dataList[indexPath.row].value
    cell.updateLayout()
    return cell
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...