TextFieldTableViewController.swift 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. //
  2. // TextFieldTableViewController.swift
  3. // Naterade
  4. //
  5. // Created by Nathan Racklyeft on 8/30/15.
  6. // Copyright © 2015 Nathan Racklyeft. All rights reserved.
  7. //
  8. import UIKit
  9. public protocol TextFieldTableViewControllerDelegate: AnyObject {
  10. func textFieldTableViewControllerDidEndEditing(_ controller: TextFieldTableViewController)
  11. func textFieldTableViewControllerDidReturn(_ controller: TextFieldTableViewController)
  12. }
  13. open class TextFieldTableViewController: UITableViewController, UITextFieldDelegate {
  14. private weak var textField: UITextField?
  15. public var indexPath: IndexPath?
  16. public var placeholder: String?
  17. public var unit: String?
  18. public var value: String? {
  19. didSet {
  20. delegate?.textFieldTableViewControllerDidEndEditing(self)
  21. }
  22. }
  23. public var contextHelp: String?
  24. public var keyboardType = UIKeyboardType.default
  25. public var autocapitalizationType = UITextAutocapitalizationType.sentences
  26. open weak var delegate: TextFieldTableViewControllerDelegate?
  27. public convenience init() {
  28. self.init(style: .grouped)
  29. }
  30. open override func viewDidLoad() {
  31. super.viewDidLoad()
  32. tableView.cellLayoutMarginsFollowReadableWidth = true
  33. tableView.register(TextFieldTableViewCell.nib(), forCellReuseIdentifier: TextFieldTableViewCell.className)
  34. }
  35. open override func viewDidAppear(_ animated: Bool) {
  36. super.viewDidAppear(animated)
  37. textField?.becomeFirstResponder()
  38. }
  39. // MARK: - UITableViewDataSource
  40. open override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
  41. return 1
  42. }
  43. open override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
  44. let cell = tableView.dequeueReusableCell(withIdentifier: TextFieldTableViewCell.className, for: indexPath) as! TextFieldTableViewCell
  45. textField = cell.textField
  46. cell.textField.delegate = self
  47. cell.textField.text = value
  48. cell.textField.keyboardType = keyboardType
  49. cell.textField.placeholder = placeholder
  50. cell.textField.autocapitalizationType = autocapitalizationType
  51. cell.unitLabel?.text = unit
  52. return cell
  53. }
  54. open override func tableView(_ tableView: UITableView, titleForFooterInSection section: Int) -> String? {
  55. return contextHelp
  56. }
  57. open override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
  58. if indexPath == IndexPath(row: 0, section: 0), let textField = textField {
  59. if textField.isFirstResponder {
  60. textField.resignFirstResponder()
  61. } else {
  62. textField.becomeFirstResponder()
  63. }
  64. }
  65. tableView.deselectRow(at: indexPath, animated: true)
  66. }
  67. // MARK: - UITextFieldDelegate
  68. open func textFieldShouldEndEditing(_ textField: UITextField) -> Bool {
  69. value = textField.text
  70. return true
  71. }
  72. open func textFieldShouldReturn(_ textField: UITextField) -> Bool {
  73. value = textField.text
  74. textField.delegate = nil
  75. delegate?.textFieldTableViewControllerDidReturn(self)
  76. return false
  77. }
  78. }