AuthenticationTableViewCell.swift 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. //
  2. // AuthenticationTableViewCell.swift
  3. // Loop
  4. //
  5. // Created by Nate Racklyeft on 7/2/16.
  6. // Copyright © 2016 Nathan Racklyeft. All rights reserved.
  7. //
  8. import UIKit
  9. public final class AuthenticationTableViewCell: UITableViewCell {
  10. @IBOutlet public weak var titleLabel: UILabel!
  11. @IBOutlet public weak var textField: UITextField!
  12. public override func setSelected(_ selected: Bool, animated: Bool) {
  13. super.setSelected(selected, animated: animated)
  14. if selected {
  15. textField.becomeFirstResponder()
  16. }
  17. }
  18. public override func prepareForReuse() {
  19. super.prepareForReuse()
  20. textField.delegate = nil
  21. credentialOptionPicker = nil
  22. }
  23. var credentialOptionPicker: CredentialOptionPicker? {
  24. didSet {
  25. if let picker = credentialOptionPicker {
  26. picker.delegate = self
  27. textField.text = picker.selectedOption.title
  28. textField.inputView = picker.view
  29. textField.tintColor = .clear // Makes the cursor invisible
  30. } else {
  31. textField.inputView = nil
  32. textField.tintColor = nil
  33. }
  34. }
  35. }
  36. var value: String? {
  37. if let picker = credentialOptionPicker {
  38. return picker.value
  39. } else {
  40. return textField.text
  41. }
  42. }
  43. }
  44. extension AuthenticationTableViewCell: CredentialOptionPickerDelegate {
  45. func credentialOptionDataSourceDidUpdateValue(_ picker: CredentialOptionPicker) {
  46. textField.text = picker.selectedOption.title
  47. textField.delegate?.textFieldDidEndEditing?(textField)
  48. }
  49. }
  50. protocol CredentialOptionPickerDelegate: class {
  51. func credentialOptionDataSourceDidUpdateValue(_ picker: CredentialOptionPicker)
  52. }
  53. class CredentialOptionPicker: NSObject, UIPickerViewDataSource, UIPickerViewDelegate {
  54. let options: [(title: String, value: String)]
  55. weak var delegate: CredentialOptionPickerDelegate?
  56. let view = UIPickerView()
  57. var selectedOption: (title: String, value: String) {
  58. let index = view.selectedRow(inComponent: 0)
  59. guard index >= options.startIndex && index < options.endIndex else {
  60. return options[0]
  61. }
  62. return options[index]
  63. }
  64. var value: String? {
  65. get {
  66. return selectedOption.value
  67. }
  68. set {
  69. let index: Int
  70. if let value = newValue, let optionIndex = options.firstIndex(where: { $0.value == value }) {
  71. index = optionIndex
  72. } else {
  73. index = 0
  74. }
  75. view.selectRow(index, inComponent: 0, animated: view.superview != nil)
  76. }
  77. }
  78. init(options: [(title: String, value: String)]) {
  79. assert(options.count > 0, "At least one option must be specified")
  80. self.options = options
  81. super.init()
  82. view.dataSource = self
  83. view.delegate = self
  84. }
  85. // MARK: - UIPickerViewDataSource
  86. func numberOfComponents(in pickerView: UIPickerView) -> Int {
  87. return 1
  88. }
  89. func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
  90. return options.count
  91. }
  92. // MARK: - UIPickerViewDelegate
  93. func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
  94. return options[row].title
  95. }
  96. func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
  97. delegate?.credentialOptionDataSourceDidUpdateValue(self)
  98. }
  99. }