无法在tableview swift中单击按钮时更新datePicker中的时间

时间:2017-07-05 08:35:28

标签: swift uitableview

我正在尝试显示日期选择器并在按钮点击时更新其时间。

我有一个表格视图,显示营业时间,如下图1所示。

图1

enter image description here

单击单元格中的计时单元格或时间按钮时,我正在展开单元格以显示日期选择器,我无法将日期选择器中的时间更新为时间按钮上的时间。

例如,当点击上午9:00时,我想在日期选择器上显示上午9:00,如下图2所示,或者当点击下午5:00时,我想在下午5:00显示日期选择器。

此外,当用户更改日期选择器中的时间时,我想更新tableview单元格中的相应时间按钮。

图2

enter image description here

以下是代码,请参阅下面的代码//Updating the date picker

由于我正在尝试更新闭包内的日期选择器时间,因此它似乎无法正常工作。有人可以建议我如何解决这个问题吗?

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        tableView.setEditing(true, animated: true)      // This displays the delete button infront of the cell
        tableView.allowsSelectionDuringEditing = true   // Allows the table view cells to be selected during editing mode

        if indexPath.section == 0 {

            let cell = Bundle.main.loadNibNamed("DailyTimesTableViewCell", owner: self, options: nil)?.first as! DailyTimesTableViewCell

            // Configure the cell...
            cell.selectionStyle             = UITableViewCellSelectionStyle.none; // Ensuring that there is no background for the selected cell
            cell.datePicker.datePickerMode  = .time         // Setting start and time            
            cell.datePicker.minuteInterval = 5
            cell.datePicker.addTarget(self, action: #selector(datePickerChanged), for: .valueChanged)

            let startTime   = timesArray[indexPath.row]["startTime"]
            cell.startTime.setTitle(startTime as! String?, for: .normal)
            cell.startTime.setTitleColor(UIColor.black, for: .normal)

            let endTime     = timesArray[indexPath.row]["endTime"]

            cell.endTime.setTitle(endTime as! String?, for: .normal)
            cell.endTime.setTitleColor(UIColor.black, for: .normal)

            // Closure
            cell.startTimeTapped = { (button  : UIButton) -> Void in

                // Updating the date picker 
                cell.datePicker.date = self.convertToDateObject(timeString: startTime as! String)
                tableView.reloadRows(at: [indexPath], with: UITableViewRowAnimation.automatic)

                // Expanding the cell to show date picker 
                if self.selectedCellIndexPath != nil && self.selectedCellIndexPath == indexPath {
                    tableView.cellForRow(at: indexPath)?.setEditing(true, animated: true)   // This displays the delete button infront of the cell
                    self.selectedCellIndexPath = nil
                } else {
                    self.selectedCellIndexPath = indexPath
                }


            }

            // Closure
            cell.endTimeTapped = { (button) -> Void in
                // Updating the date picker
                cell.datePicker.date = self.convertToDateObject(timeString: endTime as! String)
                tableView.reloadRows(at: [indexPath], with: UITableViewRowAnimation.automatic)

                // Expanding the cell to show date picker 
                if self.selectedCellIndexPath != nil && self.selectedCellIndexPath == indexPath{
                    tableView.cellForRow(at: indexPath)?.setEditing(true, animated: true)
                    self.selectedCellIndexPath = nil
                }else{
                    self.selectedCellIndexPath = indexPath
                }
            }
            return cell
      }
}

DailyTimesTableViewCell代码:

import UIKit

class DailyTimesTableViewCell: UITableViewCell, UITableViewDelegate {
    typealias  buttonTappedBlock = (_ button:UIButton) -> Void
    var startTimeTapped : buttonTappedBlock!
    var endTimeTapped : buttonTappedBlock!



    @IBAction func startTimeClicked(_ sender: subclassedUIButton) {
        if startTimeTapped != nil {
            startTimeTapped(sender as UIButton)
        }
    }

    @IBAction func endTimeClicked(_ sender: UIButton) {
        if endTimeTapped != nil{
            endTimeTapped(sender as UIButton)
        }
    }
}

2 个答案:

答案 0 :(得分:1)

要设置UIDatePicker的日期,只需使用此段代码将字符串形成的时间转换为日期

let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat =  "HH:mm"
let date = dateFormatter.dateFromString("17:00")//Put textfield.text! here

datePicker.date = date

对于问题的第二部分,由于您可能有多个日期选择器,您需要做的是向所有选择器添加选择更改侦听器,然后确定哪个更改以及单击哪个标签。最后将标签设置为正确的值。

您可以使用部门编号找出点击的数据选择器。在cellForRow中,将部分添加为标记,然后添加侦听器

datePicker.tag = indexPath.section
textView.tag = indexPath.section
datePicker.addTarget(self, action: Selector("dataPickerChanged:"), forControlEvents: UIControlEvents.ValueChanged)

然后在侦听器函数中,找出哪个数据选择器已更改值

func datePickerChanged(datePicker:UIDatePicker) {
    var dateFormatter = NSDateFormatter()
    dateFormatter.dateStyle = NSDateFormatterStyle.ShortStyle
    dateFormatter.timeStyle = NSDateFormatterStyle.ShortStyle

    if datePicker.tag == 0 {
        textView.text = dateFormatter.stringFromDate(datePicker.date)
    }
    // keep going

}

答案 1 :(得分:0)

这部分问题的答案:

  

我无法将日期选择器中的时间更新为时间   时间按钮

是以下代码:

问题出在这行代码tableView.reloadRows(at: [indexPath], with: UITableViewRowAnimation.automatic)上,并添加tableView.beginUpdates()tableView.beginUpdates()并返回帮助的单元格。

在更新为以下代码的函数cellForRow At

cell.startTimeTapped = { (button) -> DailyTimesTableViewCell in
                self.tableView.beginUpdates()
                cell.datePicker.date = self.convertToDateObject(timeString: startTime as! String)
                if self.selectedCellIndexPath != nil && self.selectedCellIndexPath == indexPath {
                    tableView.cellForRow(at: indexPath)?.setEditing(true, animated: true)   // This displays the delete button infront of the cell
                    self.selectedCellIndexPath = nil
                } else {
                    self.selectedCellIndexPath = indexPath
                }

                tableView.endUpdates()

                return cell

            }

在DailyTimesTableViewCell类中,更新为以下代码

class DailyTimesTableViewCell: UITableViewCell, UITableViewDelegate {

typealias  buttonTappedBlock = (_ button:UIButton) -> DailyTimesTableViewCell
    var startTimeTapped : buttonTappedBlock!
    var endTimeTapped : buttonTappedBlock!
    @IBAction func startTimeClicked(_ sender: UIButton) {

        if startTimeTapped != nil {
            startTimeTapped(sender as UIButton)
        }
   }

}