我正在尝试显示日期选择器并在按钮点击时更新其时间。
我有一个表格视图,显示营业时间,如下图1所示。
图1
单击单元格中的计时单元格或时间按钮时,我正在展开单元格以显示日期选择器,我无法将日期选择器中的时间更新为时间按钮上的时间。
例如,当点击上午9:00时,我想在日期选择器上显示上午9:00,如下图2所示,或者当点击下午5:00时,我想在下午5:00显示日期选择器。
此外,当用户更改日期选择器中的时间时,我想更新tableview单元格中的相应时间按钮。
图2
以下是代码,请参阅下面的代码//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)
}
}
}
答案 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)
}
}
}