我正在构建一个静态表视图,其中一个单元格包含一个标签,另一个单元格包含一个UIDatePicker。我想用日期选择器中的日期更新标签,但标签中的文本不会更新。有人可以指出我正确的方向吗?
到目前为止我的代码看起来像这样:
class HomeController: UIViewController {
let tableView: UITableView = UITableView()
private var showDatePicker: Bool = false
var dateLabel = "Select date"
var datePicker = UIDatePicker()
extension HomeController: UITableViewDelegate, UITableViewDataSource {
@objc func datePickerChanged(sender: UIDatePicker) {
let formatter: DateFormatter = DateFormatter()
formatter.dateStyle = .medium
formatter.timeStyle = .short
let selectedDate = formatter.string(from: sender.date)
dateLabel = selectedDate
print("The selected date is: \(selectedDate)")
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
switch indexPath.row {
case 0:
let dateCell = tableView.dequeueReusableCell(withIdentifier: dateId, for: indexPath) as! DateCell
dateCell.homeController = self
dateCell.dateTextLabel.text = dateLabel
return dateCell
case 1:
let datePickerCell = tableView.dequeueReusableCell(withIdentifier: datePickerId, for: indexPath) as! DatePickerCell
datePickerCell.homeController = self
datePicker = datePickerCell.datePicker
datePicker.addTarget(self, action: #selector(datePickerChanged(sender:)), for: .valueChanged)
return datePickerCell
}
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
if indexPath.row == 0 {
toggleShowDatePicker(tableView)
datePickerChanged(sender: datePicker)
}
tableView.deselectRow(at: indexPath as IndexPath, animated: true)
}
private func toggleShowDatePicker(_ tableView: UITableView) {
showDatePicker = !showDatePicker
tableView.beginUpdates()
tableView.endUpdates()
}
答案 0 :(得分:0)
在datePickerChanged
方法结束时,您需要告诉表格视图重新加载第一个单元格。
您可以使用tableView.reloadData()
重新加载整个表格视图,但您应该重新加载一个单元格。使用以下行执行此操作:
tableView.reloadRows(at: [IndexPath(row: 0, section: 0)], with: .fade)
将其设为datePickerChanged
方法的最后一行。
答案 1 :(得分:0)
您需要在更新标签值后重新加载tableview。请替换此方法
@objc func datePickerChanged(sender: UIDatePicker) {
let formatter: DateFormatter = DateFormatter()
formatter.dateStyle = .medium
formatter.timeStyle = .short
let selectedDate = formatter.string(from: sender.date)
dateLabel = selectedDate
tableView.reloadData()
print("The selected date is: \(selectedDate)")
}