gpt4 book ai didi

ios - 重用 UITableViewCell 时无法重置 UILabel attributeText

转载 作者:行者123 更新时间:2023-12-01 16:20:54 25 4
gpt4 key购买 nike

问题

我正在使用 UITableView 来显示信用卡交易列表。如果交易是退款,我将在标签中添加删除线样式:

Example of my UITableViewCells

当重复使用该特定单元格时,就会出现问题。即使重置标签的 textattributedText 属性后,删除线装饰仍然存在。

下面我添加了代码的相关部分:

表格 View

class TimelineViewController: UIViewController {

private lazy var tableView: UITableView = {
let tableView = UITableView.init(frame: view.frame, style: .plain)
tableView.translatesAutoresizingMaskIntoConstraints = false
tableView.register(TimelineTableViewCell.self, forCellReuseIdentifier: TimelineTableViewCell.reuseIdentifier)
tableView.dataSource = self
tableView.delegate = self
return tableView
}()

override func viewDidLoad() {
super.viewDidLoad()
addTableViewOnView()
getTimeline()
}

}

extension TimelineViewController: UITableViewDataSource {

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let cell = tableView.dequeueReusableCell(withIdentifier: TimelineTableViewCell.reuseIdentifier,
for: indexPath) as? TimelineTableViewCell else { fatalError() }
cell.transactionData = viewModel.timeline[indexPath.row]
return cell
}

}

表格 View 单元格

class TimelineTableViewCell: UITableViewCell {

static let reuseIdentifier = "TimelineTableViewCell"

var transactionData: TimelineResponseModel! {
didSet {
// Reset the labels
transactionDescriptionLabel.text = nil
transactionDescriptionLabel.attributedText = nil
transactionValueLabel.text = nil
transactionValueLabel.attributedText = nil

// Fill in the values
transactionDescriptionLabel.text = transactionData.description
transactionValueLabel.text = Formatter.currency.string(for: transactionData.balance)

if transactionData.isChargeback {
let value = Formatter.currency.string(for: transactionData.balance) ?? ""
transactionDescriptionLabel.attributedText = transactionData.description.strikedThrough()
transactionValueLabel.attributedText = value.strikedThrough()
}
}
}

private lazy var transactionDescriptionLabel: UILabel = {
let transactionDescriptionLabel = UILabel()
transactionDescriptionLabel.translatesAutoresizingMaskIntoConstraints = false
transactionDescriptionLabel.font = UIFont.preferredFont(forTextStyle: .footnote)
transactionDescriptionLabel.adjustsFontForContentSizeCategory = true
transactionDescriptionLabel.textColor = UIColor.activeText()
transactionDescriptionLabel.numberOfLines = 0
return transactionDescriptionLabel
}()

private lazy var transactionValueLabel: UILabel = {
let transactionValueLabel = UILabel()
transactionValueLabel.translatesAutoresizingMaskIntoConstraints = false
transactionValueLabel.font = UIFont.preferredFont(forTextStyle: .caption1).bold()
transactionValueLabel.adjustsFontForContentSizeCategory = true
transactionValueLabel.textColor = UIColor.activeText()
return transactionValueLabel
}()

override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
addTransactionDescriptionLabel()
addTransactionValueLabel()
}

}

删除线样式

extension String {

func strikedThrough() -> NSAttributedString {
let strikethroughStyle = [NSAttributedString.Key.strikethroughStyle: NSUnderlineStyle.single.rawValue]
return NSAttributedString(string: self, attributes: strikethroughStyle)
}

}

我尝试过的

我尝试了一些方法,但没有成功:

  • 覆盖 prepareForReuse 并重置标签的 textattributedText
  • if transactionData.isChargeback 之后创建一个 else,以设置 transactionDescriptionLabeltransactionValueLabel 属性文本,但不包含装饰

那么,当单元格被重复使用时,如何重置它的标签以删除我之前添加的删除线样式?

最佳答案

亚历克斯的回答确实解决了我的问题,但我也发现了为什么标签重置不起作用。我会把它留在这里,以防它对某人有用。

出于某种原因,如果我仅重置 attributedText,它会起作用:

transactionDescriptionLabel.attributedText = nil
transactionValueLabel.attributedText = nil

或者,如果我先重置 attributedText,然后重置 text,它也可以工作:

transactionDescriptionLabel.attributedText = nil
transactionValueLabel.attributedText = nil
transactionDescriptionLabel.text = nil
transactionValueLabel.text = nil

根据 UILabel 文档,为任一属性分配新值会替换另一个属性的值,因此顺序并不重要。但显然确实如此。

https://developer.apple.com/documentation/uikit/uilabel/1620538-text

https://developer.apple.com/documentation/uikit/uilabel/1620542-attributedtext

关于ios - 重用 UITableViewCell 时无法重置 UILabel attributeText,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58628067/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com