XLFormInlineSegmentedCell.m 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. //
  2. // XLFormInlineSegmentedCell.m
  3. // XLForm
  4. //
  5. // Created by mathias Claassen on 16/12/15.
  6. // Copyright © 2015 Xmartlabs. All rights reserved.
  7. //
  8. #import "XLFormInlineSegmentedCell.h"
  9. NSString * const XLFormRowDescriptorTypeSegmentedInline = @"XLFormRowDescriptorTypeSegmentedInline";
  10. NSString * const XLFormRowDescriptorTypeSegmentedControl = @"XLFormRowDescriptorTypeSegmentedControl";
  11. @implementation XLFormInlineSegmentedCell
  12. +(void)load
  13. {
  14. [XLFormViewController.cellClassesForRowDescriptorTypes setObject:[XLFormInlineSegmentedCell class] forKey:XLFormRowDescriptorTypeSegmentedInline];
  15. [XLFormViewController.inlineRowDescriptorTypesForRowDescriptorTypes setObject:XLFormRowDescriptorTypeSegmentedControl forKey:XLFormRowDescriptorTypeSegmentedInline];
  16. }
  17. - (BOOL)canBecomeFirstResponder
  18. {
  19. return YES;
  20. }
  21. -(BOOL)becomeFirstResponder
  22. {
  23. if (self.isFirstResponder){
  24. return [super becomeFirstResponder];
  25. }
  26. BOOL result = [super becomeFirstResponder];
  27. if (result){
  28. XLFormRowDescriptor * inlineRowDescriptor = [XLFormRowDescriptor formRowDescriptorWithTag:nil rowType:[XLFormViewController inlineRowDescriptorTypesForRowDescriptorTypes][self.rowDescriptor.rowType]];
  29. UITableViewCell<XLFormDescriptorCell> * cell = [inlineRowDescriptor cellForFormController:self.formViewController];
  30. NSAssert([cell conformsToProtocol:@protocol(XLFormInlineRowDescriptorCell)], @"inline cell must conform to XLFormInlineRowDescriptorCell");
  31. UITableViewCell<XLFormInlineRowDescriptorCell> * inlineCell = (UITableViewCell<XLFormInlineRowDescriptorCell> *)cell;
  32. inlineCell.inlineRowDescriptor = self.rowDescriptor;
  33. [self.rowDescriptor.sectionDescriptor addFormRow:inlineRowDescriptor afterRow:self.rowDescriptor];
  34. [self.formViewController ensureRowIsVisible:inlineRowDescriptor];
  35. }
  36. return result;
  37. }
  38. -(BOOL)resignFirstResponder
  39. {
  40. if (![self isFirstResponder]) {
  41. return [super resignFirstResponder];
  42. }
  43. NSIndexPath * selectedRowPath = [self.formViewController.form indexPathOfFormRow:self.rowDescriptor];
  44. NSIndexPath * nextRowPath = [NSIndexPath indexPathForRow:selectedRowPath.row + 1 inSection:selectedRowPath.section];
  45. XLFormRowDescriptor * nextFormRow = [self.formViewController.form formRowAtIndex:nextRowPath];
  46. XLFormSectionDescriptor * formSection = [self.formViewController.form.formSections objectAtIndex:nextRowPath.section];
  47. BOOL result = [super resignFirstResponder];
  48. if (result) {
  49. [formSection removeFormRow:nextFormRow];
  50. }
  51. return result;
  52. }
  53. #pragma mark - XLFormDescriptorCell
  54. -(void)configure
  55. {
  56. [super configure];
  57. }
  58. -(void)update
  59. {
  60. [super update];
  61. self.accessoryType = UITableViewCellAccessoryNone;
  62. self.editingAccessoryType = UITableViewCellAccessoryNone;
  63. [self.textLabel setText:self.rowDescriptor.title];
  64. self.selectionStyle = UITableViewCellSelectionStyleNone;
  65. self.detailTextLabel.text = [self valueDisplayText];
  66. }
  67. -(BOOL)formDescriptorCellCanBecomeFirstResponder
  68. {
  69. return !(self.rowDescriptor.isDisabled);
  70. }
  71. -(BOOL)formDescriptorCellBecomeFirstResponder
  72. {
  73. if ([self isFirstResponder]){
  74. [self resignFirstResponder];
  75. return NO;
  76. }
  77. return [self becomeFirstResponder];
  78. }
  79. -(void)formDescriptorCellDidSelectedWithFormController:(XLFormViewController *)controller
  80. {
  81. [controller.tableView deselectRowAtIndexPath:[controller.form indexPathOfFormRow:self.rowDescriptor] animated:YES];
  82. }
  83. #pragma mark - Helpers
  84. -(NSString *)valueDisplayText
  85. {
  86. return (self.rowDescriptor.value ? [self.rowDescriptor.value displayText] : self.rowDescriptor.noValueDisplayText);
  87. }
  88. @end
  89. @implementation XLFormInlineSegmentedControl
  90. @synthesize segmentedControl = _segmentedControl;
  91. @synthesize inlineRowDescriptor = _inlineRowDescriptor;
  92. +(void)load
  93. {
  94. [XLFormViewController.cellClassesForRowDescriptorTypes setObject:[XLFormInlineSegmentedControl class] forKey:XLFormRowDescriptorTypeSegmentedControl];
  95. }
  96. -(void)configure
  97. {
  98. [super configure];
  99. self.selectionStyle = UITableViewCellSelectionStyleNone;
  100. [self.contentView addSubview:self.segmentedControl];
  101. [self.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[segmentedControl]-|"
  102. options:NSLayoutFormatAlignAllCenterY
  103. metrics:0
  104. views:@{@"segmentedControl": self.segmentedControl}]];
  105. [self.segmentedControl addTarget:self action:@selector(valueChanged) forControlEvents:UIControlEventValueChanged];
  106. }
  107. -(void)update
  108. {
  109. [super update];
  110. [self updateSegmentedControl];
  111. self.segmentedControl.selectedSegmentIndex = [self selectedIndex];
  112. self.segmentedControl.enabled = !self.rowDescriptor.isDisabled;
  113. }
  114. -(UISegmentedControl *)segmentedControl
  115. {
  116. if (_segmentedControl) return _segmentedControl;
  117. _segmentedControl = [UISegmentedControl autolayoutView];
  118. [_segmentedControl setContentHuggingPriority:500 forAxis:UILayoutConstraintAxisHorizontal];
  119. return _segmentedControl;
  120. }
  121. #pragma mark - Action
  122. -(void)valueChanged
  123. {
  124. self.inlineRowDescriptor.value = [self.inlineRowDescriptor.selectorOptions objectAtIndex:self.segmentedControl.selectedSegmentIndex];
  125. [self.formViewController updateFormRow:self.inlineRowDescriptor];
  126. }
  127. #pragma mark - Helper
  128. -(NSArray *)getItems
  129. {
  130. NSMutableArray * result = [[NSMutableArray alloc] init];
  131. for (id option in self.inlineRowDescriptor.selectorOptions)
  132. [result addObject:[option displayText]];
  133. return result;
  134. }
  135. -(void)updateSegmentedControl
  136. {
  137. [self.segmentedControl removeAllSegments];
  138. [[self getItems] enumerateObjectsUsingBlock:^(id object, NSUInteger idex, __unused BOOL *stop){
  139. [self.segmentedControl insertSegmentWithTitle:[object displayText] atIndex:idex animated:NO];
  140. }];
  141. }
  142. -(NSInteger)selectedIndex
  143. {
  144. XLFormRowDescriptor * formRow = self.inlineRowDescriptor ?: self.rowDescriptor;
  145. if (formRow.value){
  146. for (id option in formRow.selectorOptions){
  147. if ([[option valueData] isEqual:[formRow.value valueData]]){
  148. return [formRow.selectorOptions indexOfObject:option];
  149. }
  150. }
  151. }
  152. return -1;
  153. }
  154. @end