2017-09-03 58 views
0

我正在构建一个包含一个标签和另一个UIDatePicker的单元格的静态tableview。我想用日期选择器中的日期更新标签,但标签中的文本不会更新。有人可以请指点我正确的方向吗?从tableview中的UIDatePicker更新UILabel

到目前为止我的代码看起来是这样的:

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

你试过了'tableView.reloadData()'吗? – krlb

回答

0

在你datePickerChanged方法,你需要告诉表视图重新加载第一个单元格结束。

您可以使用tableView.reloadData()重新加载整个表格,但您应该重新加载一个单元格。使用以下行:

tableView.reloadRows(at: [IndexPath(row: 0, section: 0)], with: .fade) 

确保您的datePickerChanged方法的最后一行。

+0

谢谢!当我把它放在DidSelectRowAt方法中时它工作。 – Niklas

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)") 
}