You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

纯代码开发iOS时UILabel刷新视图未替换原有文本如何解决?

问题根因

你每次刷新页面都调用buildTransactionTableView()方法,而这个方法每次执行都会新建一整套StackView、Label、表格控制器视图,重复添加到当前控制器的view上,旧的视图没有被移除,所以新的金额Label会叠在旧Label的上方,才会出现文字重叠乱码的情况。你之前尝试修改单个Label或者移除单个Label都没用,因为你操作的是本次新建的Label,旧的Label还在下层显示。

推荐解决方案(性能最优)

只初始化一次UI,刷新时仅更新数据,不需要重复创建视图:

  1. 首先给当前ViewController添加全局属性:
// 声明在控制器类中,不要放在方法内部
private var mainStackView: UIStackView?
private var balancedOwedAmountLabel: UILabel?
  1. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 13:09:05