// // XLFormPickerCell.m // XLForm ( https://github.com/xmartlabs/XLForm ) // // Copyright (c) 2015 Xmartlabs ( http://xmartlabs.com ) // // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. #import "UIView+XLFormAdditions.h" #import "XLFormPickerCell.h" #import "NCBridgeSwift.h" @interface XLFormPickerCell() @end @implementation XLFormPickerCell @synthesize pickerView = _pickerView; @synthesize inlineRowDescriptor = _inlineRowDescriptor; -(BOOL)formDescriptorCellCanBecomeFirstResponder { return (!self.rowDescriptor.isDisabled && (self.inlineRowDescriptor == nil)); } -(BOOL)formDescriptorCellBecomeFirstResponder { return [self becomeFirstResponder]; } -(BOOL)canResignFirstResponder { return YES; } -(BOOL)canBecomeFirstResponder { return [self formDescriptorCellCanBecomeFirstResponder]; } #pragma mark - Properties -(UIPickerView *)pickerView { if (_pickerView) return _pickerView; _pickerView = [UIPickerView autolayoutView]; _pickerView.delegate = self; _pickerView.dataSource = self; return _pickerView; } #pragma mark - XLFormDescriptorCell -(void)configure { [super configure]; [self.contentView addSubview:self.pickerView]; [self.contentView addConstraint:[NSLayoutConstraint constraintWithItem:self.pickerView attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self.contentView attribute:NSLayoutAttributeCenterX multiplier:1 constant:0]]; [self.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-0-[pickerView]-0-|" options:0 metrics:0 views:@{@"pickerView" : self.pickerView}]]; } -(void)update { [super update]; BOOL isDisable = self.rowDescriptor.isDisabled; self.userInteractionEnabled = !isDisable; self.contentView.alpha = isDisable ? 0.5 : 1.0; [self.pickerView selectRow:[self selectedIndex] inComponent:0 animated:NO]; [self.pickerView reloadAllComponents]; } +(CGFloat)formDescriptorCellHeightForRowDescriptor:(XLFormRowDescriptor *)rowDescriptor { return 216.0f; } #pragma mark - UIPickerViewDelegate //TWS - (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view { [[pickerView.subviews objectAtIndex:1] setHidden:TRUE]; [[pickerView.subviews objectAtIndex:2] setHidden:TRUE]; UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, pickerView.frame.size.width, 50)]; label.backgroundColor = [UIColor clearColor]; label.textColor = NCBrandColor.sharedInstance.textView; label.font = [UIFont systemFontOfSize:13]; label.textAlignment = NSTextAlignmentCenter; [label setText:[self.rowDescriptor.selectorOptions objectAtIndex:row]]; return label; } - (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component { if (self.inlineRowDescriptor){ if (self.inlineRowDescriptor.valueTransformer){ NSAssert([self.inlineRowDescriptor.valueTransformer isSubclassOfClass:[NSValueTransformer class]], @"valueTransformer is not a subclass of NSValueTransformer"); NSValueTransformer * valueTransformer = [self.inlineRowDescriptor.valueTransformer new]; NSString * tranformedValue = [valueTransformer transformedValue:[[self.inlineRowDescriptor.selectorOptions objectAtIndex:row] valueData]]; if (tranformedValue){ return tranformedValue; } } return [[self.inlineRowDescriptor.selectorOptions objectAtIndex:row] displayText]; } if (self.rowDescriptor.valueTransformer){ NSAssert([self.rowDescriptor.valueTransformer isSubclassOfClass:[NSValueTransformer class]], @"valueTransformer is not a subclass of NSValueTransformer"); NSValueTransformer * valueTransformer = [self.rowDescriptor.valueTransformer new]; NSString * tranformedValue = [valueTransformer transformedValue:[[self.rowDescriptor.selectorOptions objectAtIndex:row] valueData]]; if (tranformedValue){ return tranformedValue; } } return [[self.rowDescriptor.selectorOptions objectAtIndex:row] displayText]; } - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component { if (self.inlineRowDescriptor){ self.inlineRowDescriptor.value = [self.inlineRowDescriptor.selectorOptions objectAtIndex:row]; [self.formViewController updateFormRow:self.inlineRowDescriptor]; } else{ [self becomeFirstResponder]; self.rowDescriptor.value = [self.rowDescriptor.selectorOptions objectAtIndex:row]; } } #pragma mark - UIPickerViewDataSource - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView { return 1; } - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component { if (self.inlineRowDescriptor){ return self.inlineRowDescriptor.selectorOptions.count; } return self.rowDescriptor.selectorOptions.count; } #pragma mark - helpers -(NSInteger)selectedIndex { XLFormRowDescriptor * formRow = self.inlineRowDescriptor ?: self.rowDescriptor; if (formRow.value){ for (id option in formRow.selectorOptions){ if ([[option valueData] isEqual:[formRow.value valueData]]){ return [formRow.selectorOptions indexOfObject:option]; } } } return -1; } @end