如何在弹出视图控制器中更新 UIButton 文本时更改其值?

问题描述

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

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

VC with Table View

-segue->

Pop-up screen

带有表格视图的 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
        }
    }
}

解决方法

如果按钮在 tableView 中,则应通过以下方式更新选定的 tableView 行;

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

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

selectedTaskTime: String { 
  didSet {
 
         }
       }