问题描述
这里,我有一个带有表视图的 VC,其中包含带有“设置时间”按钮的单元格。当我点击“设置时间”按钮时,它会转到一个弹出屏幕。在这里,我可以点击“保存时间”按钮来保存时间(例如:“1:30”)并关闭弹出窗口。
弹出窗口关闭后,我想更新表视图行中“设置时间”按钮的文本,该按钮被选中以显示保存的时间(例如:“1:30”)。当我运行我的代码时,在弹出屏幕中保存时间后,我的按钮文本不会在表格视图中更新。
带有表格视图的 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 {
}
}