首页 > 解决方案 > 在弹出视图控制器中更新其值时如何更改 UIButton 文本?

问题描述

在这里,我有一个带有表格视图的 VC,其中包含带有“设置时间”按钮的单元格。当我点击“设置时间”按钮时,它会转到一个弹出屏幕。在这里我可以点击“保存时间”按钮来保存时间(例如:“1:30”)并关闭弹出窗口。

弹出窗口消失后,我想更新选择显示已保存时间的表视图行中“设置时间”按钮的文本(例如:“1:30”)。当我运行我的代码时,在弹出屏幕中保存时间后,我的按钮文本不会在表格视图中更新。

带有表视图的 VC -segue-> 弹出屏幕

带有表视图的 VC

class TaskListViewController: UIViewController {
    
    var savedTaskTime = [String]()
    var selectedTaskTime = ""
    
    override func viewDidLoad() {
        super.viewDidLoad()
        taskList.delegate = self
        taskList.dataSource = self
    }

    // Unwind segue 
    @IBAction func selectTimeDidSaveTime(_ segue: UIStoryboardSegue) {
        let controller = segue.source as! SelectTimeViewController
        selectedTaskTime = controller.selectedTaskTime
    }
}

extension TaskListViewController: UITableViewDataSource, UITableViewDelegate {
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
        let cell = tableView.dequeueReusableCell(withIdentifier: "taskCell", for: indexPath) as! TaskCell
        
        // Configure timeButton title
        cell.timeButton.tag = indexPath.row
        
        if selectedTaskTime != "" {
            cell.timeButton.setTitle(savedTaskTime[indexPath.row], for: .normal)
        }
        return cell
    } 
}

弹出式VC

class SelectTimeViewController: UIViewController {
    
    var hour: String = "0"
    var min: String = "00"
    var selectedTaskTime = ""
    
    @IBOutlet weak var setTimeLabel: UILabel!
    
    @IBAction func saveTimeButton(_ sender: UIButton) {
        if setTimeLabel.text != "0:00" {
            selectedTaskTime = "\(hour + ":" + min)"
        } else {
            // *Code for error alert*
        }
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
  
        updateTimeLabel()
        // *Code to initialize slider*
    }
    
    // Update Time Label with Slider Value
    func updateTimeLabel() {
        // *Code to convert slider value to timeSet value*

        setTimeLabel.text = timeSet
    }
    
    // Segue runs when unwind segue is triggered
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "setTime" {
            let controller = segue.destination as! TaskListViewController
            controller.selectedTaskTime = selectedTaskTime
        }
    }
}

标签: iosswiftuitableviewuibutton

解决方案


如果按钮在 tableView 中,您应该更新选定的 tableView 行;

tableView.reloadRows(at: [indexPath], with: /* .none or whatever */)

在您的情况下,您应该设法更新“controller.taskList.reloadRows”或保留选定的行并更新它

selectedTaskTime: String { 
  didSet {
 
         }
       }

推荐阅读