GenericMultipleSelectorRow.swift 3.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. // GenericMultipleSelectorRow.swift
  2. // Eureka ( https://github.com/xmartlabs/Eureka )
  3. //
  4. // Copyright (c) 2016 Xmartlabs SRL ( http://xmartlabs.com )
  5. //
  6. //
  7. // Permission is hereby granted, free of charge, to any person obtaining a copy
  8. // of this software and associated documentation files (the "Software"), to deal
  9. // in the Software without restriction, including without limitation the rights
  10. // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  11. // copies of the Software, and to permit persons to whom the Software is
  12. // furnished to do so, subject to the following conditions:
  13. //
  14. // The above copyright notice and this permission notice shall be included in
  15. // all copies or substantial portions of the Software.
  16. //
  17. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  18. // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  19. // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  20. // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  21. // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  22. // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  23. // THE SOFTWARE.
  24. import Foundation
  25. import UIKit
  26. /// Generic options selector row that allows multiple selection.
  27. open class GenericMultipleSelectorRow<T, Cell: CellType>: Row<Cell>, PresenterRowType, NoValueDisplayTextConformance, OptionsProviderRow
  28. where Cell: BaseCell, Cell.Value == Set<T> {
  29. public typealias PresentedController = MultipleSelectorViewController<GenericMultipleSelectorRow<T,Cell>>
  30. /// Defines how the view controller will be presented, pushed, etc.
  31. open var presentationMode: PresentationMode<PresentedController>?
  32. /// Will be called before the presentation occurs.
  33. open var onPresentCallback: ((FormViewController, PresentedController) -> Void)?
  34. /// Title to be displayed for the options
  35. open var selectorTitle: String?
  36. open var noValueDisplayText: String?
  37. /// Options from which the user will choose
  38. open var optionsProvider: OptionsProvider<T>?
  39. required public init(tag: String?) {
  40. super.init(tag: tag)
  41. displayValueFor = { (rowValue: Set<T>?) in
  42. return rowValue?.map({ String(describing: $0) }).sorted().joined(separator: ", ")
  43. }
  44. presentationMode = .show(controllerProvider: ControllerProvider.callback {
  45. return MultipleSelectorViewController<GenericMultipleSelectorRow<T,Cell>>()
  46. }, onDismiss: { vc in
  47. let _ = vc.navigationController?.popViewController(animated: true)
  48. })
  49. }
  50. /**
  51. Extends `didSelect` method
  52. */
  53. open override func customDidSelect() {
  54. super.customDidSelect()
  55. guard let presentationMode = presentationMode, !isDisabled else { return }
  56. if let controller = presentationMode.makeController() {
  57. controller.row = self
  58. controller.title = selectorTitle ?? controller.title
  59. onPresentCallback?(cell.formViewController()!, controller)
  60. presentationMode.present(controller, row: self, presentingController: self.cell.formViewController()!)
  61. } else {
  62. presentationMode.present(nil, row: self, presentingController: self.cell.formViewController()!)
  63. }
  64. }
  65. /**
  66. Prepares the pushed row setting its title and completion callback.
  67. */
  68. open override func prepare(for segue: UIStoryboardSegue) {
  69. super.prepare(for: segue)
  70. guard let rowVC = segue.destination as Any as? PresentedController else { return }
  71. rowVC.title = selectorTitle ?? rowVC.title
  72. rowVC.onDismissCallback = presentationMode?.onDismissCallback ?? rowVC.onDismissCallback
  73. onPresentCallback?(cell.formViewController()!, rowVC)
  74. rowVC.row = self
  75. }
  76. }