DateAndDurationTableViewController.swift 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. //
  2. // DateAndDurationTableViewController.swift
  3. // LoopKitUI
  4. //
  5. // Created by Michael Pangburn on 11/24/18.
  6. // Copyright © 2018 LoopKit Authors. All rights reserved.
  7. //
  8. import UIKit
  9. public protocol DateAndDurationTableViewControllerDelegate: class {
  10. func dateAndDurationTableViewControllerDidChangeDate(_ controller: DateAndDurationTableViewController)
  11. }
  12. public class DateAndDurationTableViewController: UITableViewController {
  13. public enum InputMode {
  14. case date(Date, mode: UIDatePicker.Mode)
  15. case duration(TimeInterval)
  16. }
  17. public var inputMode: InputMode = .date(Date(), mode: .dateAndTime) {
  18. didSet {
  19. delegate?.dateAndDurationTableViewControllerDidChangeDate(self)
  20. }
  21. }
  22. public var titleText: String?
  23. public var contextHelp: String?
  24. public var indexPath: IndexPath?
  25. public weak var delegate: DateAndDurationTableViewControllerDelegate?
  26. public convenience init() {
  27. self.init(style: .grouped)
  28. }
  29. public override func viewDidLoad() {
  30. super.viewDidLoad()
  31. tableView.register(DateAndDurationTableViewCell.nib(), forCellReuseIdentifier: DateAndDurationTableViewCell.className)
  32. }
  33. private var completion: ((InputMode) -> Void)?
  34. public func onSave(_ completion: @escaping (InputMode) -> Void) {
  35. let saveBarButtonItem = UIBarButtonItem(barButtonSystemItem: .save, target: self, action: #selector(save))
  36. navigationItem.rightBarButtonItem = saveBarButtonItem
  37. self.completion = completion
  38. }
  39. @objc private func save() {
  40. completion?(inputMode)
  41. dismiss(animated: true)
  42. }
  43. public override func numberOfSections(in tableView: UITableView) -> Int {
  44. return 1
  45. }
  46. public override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
  47. return 1
  48. }
  49. public override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
  50. let cell = tableView.dequeueReusableCell(withIdentifier: DateAndDurationTableViewCell.className, for: indexPath) as! DateAndDurationTableViewCell
  51. switch inputMode {
  52. case .date(let date, mode: let mode):
  53. cell.datePicker.datePickerMode = mode
  54. cell.date = date
  55. case .duration(let duration):
  56. cell.datePicker.datePickerMode = .countDownTimer
  57. cell.maximumDuration = .hours(24)
  58. cell.duration = duration
  59. }
  60. cell.titleLabel.text = titleText
  61. cell.isDatePickerHidden = false
  62. cell.selectionStyle = .none
  63. cell.delegate = self
  64. return cell
  65. }
  66. public override func tableView(_ tableView: UITableView, titleForFooterInSection section: Int) -> String? {
  67. return contextHelp
  68. }
  69. }
  70. extension DateAndDurationTableViewController: DatePickerTableViewCellDelegate {
  71. public func datePickerTableViewCellDidUpdateDate(_ cell: DatePickerTableViewCell) {
  72. switch inputMode {
  73. case .date(_, mode: let mode):
  74. inputMode = .date(cell.date, mode: mode)
  75. case .duration(_):
  76. inputMode = .duration(cell.duration)
  77. }
  78. }
  79. }