纯代码开发iOS时UILabel刷新视图未替换原有文本如何解决?
问题根因
你每次刷新页面都调用buildTransactionTableView()方法,而这个方法每次执行都会新建一整套StackView、Label、表格控制器视图,重复添加到当前控制器的view上,旧的视图没有被移除,所以新的金额Label会叠在旧Label的上方,才会出现文字重叠乱码的情况。你之前尝试修改单个Label或者移除单个Label都没用,因为你操作的是本次新建的Label,旧的Label还在下层显示。
推荐解决方案(性能最优)
只初始化一次UI,刷新时仅更新数据,不需要重复创建视图:
- 首先给当前ViewController添加全局属性:
// 声明在控制器类中,不要放在方法内部 private var mainStackView: UIStackView? private var balancedOwedAmountLabel: UILabel?
- 修改
buildTransactionTableView方法逻辑:
private func buildTransactionTableView() { // 已创建过UI则直接更新数据,不重复构建 if let amountLabel = balancedOwedAmountLabel { // 重新计算金额更新文本 var amount = 0.00 for rtp in self.userTransactions! { if rtp.repaymentDate == nil && rtp.rtpData.amount.value != nil { let value = Double((rtp.rtpData.amount.value)!) amount = amount + value! } } amountLabel.text = " $\(String(format: "%.2f", amount))" // 更新交易列表数据并刷新 self.userTransactionsTableViewController?.rtpTransactions = self.rtpTransactions self.userTransactionsTableViewController?.tableView.reloadData() return } // 首次进入才执行UI初始化逻辑 let stackview = UIStackView() self.mainStackView = stackview stackview.axis = .vertical stackview.distribution = .fill stackview.spacing = 15 self.view.insertSubview(stackview, belowSubview: (self.accountSummaryTableViewController?.view)!) stackview.translatesAutoresizingMaskIntoConstraints = false stackview.topAnchor.constraint(equalTo: self.transactionsTableView.bottomAnchor, constant: 0).isActive = true stackview.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor, constant: 10).isActive = true stackview.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor, constant: -10).isActive = true stackview.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor,constant: -30).isActive = true let headlineStackView = UIStackView() headlineStackView.axis = .horizontal headlineStackView.alignment = .top headlineStackView.distribution = .fill let titleLabel = UILabel(frame: CGRect(x:0,y:0,width:200,height:21)) titleLabel.textAlignment = .left titleLabel.textColor = .black titleLabel.font = UIFont.boldSystemFont(ofSize: 14.00) titleLabel.text = "Transaction History" headlineStackView.addArrangedSubview(titleLabel) stackview.addArrangedSubview(headlineStackView) let balanceStackView = UIStackView() balanceStackView.axis = .horizontal balanceStackView.distribution = .fill headlineStackView.addArrangedSubview(balanceStackView) let balanceOwedLabel = UILabel(frame: CGRect(x: 0, y: 0, width: 200, height: 21)) balanceOwedLabel.textAlignment = .right balanceOwedLabel.textColor = .black balanceOwedLabel.font = balanceOwedLabel.font.withSize(14.00) balanceOwedLabel.text = "Balance Owed" balanceStackView.addArrangedSubview(balanceOwedLabel) let balancedOwedAmountLabel = UILabel(frame: CGRect(x: 0, y: 0, width: 200, height: 21)) self.balancedOwedAmountLabel = balancedOwedAmountLabel balancedOwedAmountLabel.textAlignment = .right balancedOwedAmountLabel.textColor = UIColor(red: 33.00/255, green: 150.00/255, blue: 243.00/255, alpha: 1.00) balancedOwedAmountLabel.font = UIFont.boldSystemFont(ofSize: 14.00) var amount = 0.00 for rtp in self.userTransactions! { if rtp.repaymentDate == nil && rtp.rtpData.amount.value != nil { let value = Double((rtp.rtpData.amount.value)!) amount = amount + value! } } balanceStackView.addArrangedSubview(balancedOwedAmountLabel) balancedOwedAmountLabel.text = " $\(String(format: "%.2f", amount))" let rtpTableVC = UserTransactionsTableViewController(style: .plain) rtpTableVC.tableView.allowsSelection = false rtpTableVC.tableView.separatorStyle = .none rtpTableVC.tableView.isScrollEnabled = true rtpTableVC.rtpTransactions = self.rtpTransactions stackview.addArrangedSubview(rtpTableVC.view) self.userTransactionsTableViewController = rtpTableVC }
快速适配方案(不改动原有调用逻辑)
如果一定要每次刷新都重构UI,只需要在方法开头先移除旧的视图即可:
private func buildTransactionTableView() { // 先销毁之前创建的旧StackView,避免重叠 self.mainStackView?.removeFromSuperview() // 后面接你原来的代码即可,记得把新建的stackView赋值给全局的mainStackView属性 // ... 原有逻辑 }
内容的提问来源于stack exchange,提问作者Zach Smith
相关产品推荐
相关产品推荐

