24 Commits

Author SHA1 Message Date
Mathias Claassen 870afc5660 Version bump 4.3.0 (#1080) 2021-03-24 10:27:47 -03:00
Nick Reffitt ded97b8328 Add datePicker style property to XLFormDateCell (#1078)
Co-authored-by: Nick <nick@nicks-air.mynet>
2020-11-18 10:00:10 -03:00
Mathias Claassen 74bde2185b Fix Cocoapods source (#1077) 2020-10-12 09:22:50 -03:00
Mathias Claassen d299fe32cb Version bump 4.2.0 (#1076) 2020-10-09 10:59:04 -03:00
Kyle Hankinson 234a135f08 Fixes Carthage to master branch (#1075)
* + Fix for simulator issue/carthage build issue.

* + Headers public.

Co-authored-by: Kyle Hankinson <kyle.hankinson@gmail.com>
2020-10-09 09:13:04 -03:00
Eneko Alonso 0e5da84980 Add support for distribution via Swift Package Manager (SwiftPM) (#1073)
* Add Package.swift for distribution via SwiftPM

* Update publicHeadersPath

* Remove publicHeadersPath

* Flattened file structure

* Update project references

* Clean up

* Update README with instructions for installing via SwiftPM

* Fix typo

Co-authored-by: Mathias Claassen <mathiasclaassen7@gmail.com>

Co-authored-by: Mathias Claassen <mathiasclaassen7@gmail.com>
2020-09-23 09:31:38 -03:00
Mathias Claassen 3dd39ed7bc Version bump 4.1.0 (#1060) 2019-10-02 09:52:47 -03:00
Quintz Gábor 45d363fb0c iOS 13 dark mode support. (#1057) 2019-09-23 10:49:46 -03:00
Mathias Claassen 21f97ce9a6 Swift 5 updates in Examples and change Travis to use Xcode 11 (#1058) 2019-09-20 10:23:58 -03:00
mrcararia f2383b7903 Fix crash when .Nib is inside a framework bundle. (#1050) 2019-05-14 12:00:33 -03:00
Mathias Claassen 6ac31155f8 release 4.0.1 (#1049) 2019-04-15 11:07:06 -03:00
Liraz S 151003d8e5 Memory and stability fixes to XLForm (#1045)
* selectorCell display repair

Unable to display when value than apples first selectorOptions

* fixed crash

* fixed memory leaks

* Cell disappears while inline picker is open

* Fixes crash on update

* check object object equal

* codereview

* fixed memory leaks

* fixed memory leaks [2]

* updated logic

* fixed memory leaks

* fix for crash #1043

* fix for crash #1044

* fix for issue #1044

* fix for issue #1044

* fixed mistake

* fixed observation if lib uses in drawer controller

* fixed kvo crash

* reverted last fix

* cleanup

* fixed kvo

* fix for crash #1043

* reverted https://github.com/xmartlabs/XLForm/pull/1045#discussion_r255965033

* reverted #948

* fixed firstResponder logic

* codereview in Descriptors

* codereview
2019-03-25 12:20:16 -03:00
Mathias Claassen b5bdda8e80 Update Readme (#1046) 2019-03-14 13:40:30 -03:00
Bruno Agatte 81aca9c49c Update XLFormRowDescriptor.m to support <Class>.self for custom cells (#1041) 2019-01-08 10:59:18 -03:00
Ju d8ece1410d Fix crash when using swift custom cells with xib files (#1038) (#1040) 2019-01-07 15:57:31 -03:00
Nikita Razumnuy fdca5f7543 fix: can't update placeholder color using setNeedsDisplay in XLFormTextView (#1024) 2018-08-23 11:20:17 -03:00
Martin Barreto 204cad6045 update swift example 2017-10-26 14:36:33 -03:00
Martin Barreto e68b57cded update XLForm tests 2017-10-26 14:36:33 -03:00
Martin Barreto 0bc600d5a7 fix travis 2017-10-26 14:36:33 -03:00
pera c2d721f098 minor fixes 2017-10-26 14:36:33 -03:00
pera 2485332846 Updates README.md, CHANGELOG.md & podspec. 2017-10-26 14:36:33 -03:00
pera 20b661c41e - Adds support for Xcode9
- Deprecation of UIAlertView, UIActionSheet & UIPopoverController
2017-10-26 14:36:33 -03:00
MiMo42 1e2b5137d6 Fixed crash when trying to insert row in section at index 0 (#964) 2017-06-08 11:47:26 -03:00
Miguel Revetria 43abac5c3f Fixes #893, setting rowDescriptor to the serach result controller (#961) 2017-05-25 10:20:36 -03:00
122 changed files with 2074 additions and 1969 deletions
+2 -4
View File
@@ -19,7 +19,5 @@ DerivedData
#CocoaPods
Pods
Tests/Pods
Tests/Podfile.lock
Examples/Objective-C/Podfile.lock
Examples/Swift/Podfile.lock
Podfile.lock
*.xcworkspace
+3 -4
View File
@@ -1,8 +1,7 @@
language: objective-c
osx_image: xcode8.2
osx_image: xcode12
before_install:
- gem install cocoapods --no-rdoc --no-ri --no-document --quiet
- gem install xcpretty --no-rdoc --no-ri --no-document --quiet
- gem install cocoapods --quiet
- gem install xcpretty --quiet
- cd Tests && pod install && cd $TRAVIS_BUILD_DIR
script: rake test
+23 -2
View File
@@ -1,6 +1,27 @@
# Change Log
All notable changes to this project will be documented in this file.
### Version 4.3.0:
* Add datePicker style property to XLFormDateCell (#1078)
### Version 4.2.0:
* Support for Swift Package Manager (#1073)
* Fix Carthage build (#1075)
### Version 4.1.0:
* Fix crash when .Nib is inside a framework bundle. (#1050)
* iOS 13 dark mode support. (#1057)
* Updates for Swift 5 in Examples
### Version 4.0.1:
* Memory improvements and fixes.
* Other minor fixes
### Version 4.0.0:
* Adds support for Xcode 9.
* Deprecated UIAlertView, UIActionSheet, UIPopoverController.
* Bumped minimum iOS version to 9.0.
### Version 3.3.0:
* Added `cellConfigForSelector` to style XLFormOptionsViewController
* Added properties to **limit number of characters** in `XLFormTextFieldCell` and `XLFormTextViewCell`
@@ -132,6 +153,6 @@ All notable changes to this project will be documented in this file.
* Added a convenience method to deselect a `XLFormRowDescriptor`. `-(void)deselectFormRow:(XLFormRowDescriptor *)row;`. [#33](https://github.com/xmartlabs/XLForm/issues/33 "#33").
### Version 1.0.0
### Version 1.0.0
* Initial release
* Initial release
@@ -154,38 +154,13 @@ NSString *const kCountDownTimer = @"countDownTimer";
-(void)formRowDescriptorValueHasChanged:(XLFormRowDescriptor *)formRow oldValue:(id)oldValue newValue:(id)newValue
{
// super implementation must be called
[super formRowDescriptorValueHasChanged:formRow oldValue:oldValue newValue:newValue];
if([formRow.tag isEqualToString:kDatePicker])
{
#if __IPHONE_OS_VERSION_MAX_ALLOWED < 80000
UIAlertView *message = [[UIAlertView alloc] initWithTitle:@"DatePicker"
message:@"Value Has changed!"
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[message show];
#else
if ([UIAlertController class]) {
UIAlertController * alertController = [UIAlertController alertControllerWithTitle:@"DatePicker"
message:@"Value Has changed!"
preferredStyle:UIAlertControllerStyleAlert];
[alertController addAction:[UIAlertAction actionWithTitle:@"OK"
style:UIAlertActionStyleDefault
handler:nil]];
[self presentViewController:alertController animated:YES completion:nil];
}
else{
UIAlertView *message = [[UIAlertView alloc] initWithTitle:@"DatePicker"
message:@"Value Has changed!"
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[message show];
}
#endif
}
UIAlertController * alertController = [UIAlertController alertControllerWithTitle:@"DatePicker"
message:@"Value Has changed!"
preferredStyle:UIAlertControllerStyleAlert];
[alertController addAction:[UIAlertAction actionWithTitle:@"OK"
style:UIAlertActionStyleDefault
handler:nil]];
[self presentViewController:alertController animated:YES completion:nil];
}
@end
@@ -21,7 +21,7 @@
// http://stackoverflow.com/questions/12580162/nsstring-to-nsdate-conversion-issue
@interface CurrencyFormatter : NSNumberFormatter
@property (readonly) NSDecimalNumberHandler *roundingBehavior;
@property (readonly, strong) NSDecimalNumberHandler *roundingBehavior;
@end
@@ -117,4 +117,4 @@
}
@end
@end
@@ -135,33 +135,13 @@ NSString *const kNotes = @"notes";
}
[self.tableView endEditing:YES];
#if __IPHONE_OS_VERSION_MAX_ALLOWED < 80000
UIAlertView *message = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Valid Form", nil)
message:@"No errors found"
delegate:nil
cancelButtonTitle:NSLocalizedString(@"OK", nil)
otherButtonTitles:nil];
[message show];
#else
if ([UIAlertController class]){
UIAlertController * alertController = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Valid Form", nil)
message:@"No errors found"
preferredStyle:UIAlertControllerStyleAlert];
[alertController addAction:[UIAlertAction actionWithTitle:NSLocalizedString(@"OK", nil)
style:UIAlertActionStyleDefault
handler:nil]];
[self presentViewController:alertController animated:YES completion:nil];
}
else{
UIAlertView *message = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Valid Form", nil)
message:@"No errors found"
delegate:nil
cancelButtonTitle:NSLocalizedString(@"OK", nil)
otherButtonTitles:nil];
[message show];
}
#endif
UIAlertController * alertController = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Valid Form", nil)
message:@"No errors found"
preferredStyle:UIAlertControllerStyleAlert];
[alertController addAction:[UIAlertAction actionWithTitle:NSLocalizedString(@"OK", nil)
style:UIAlertActionStyleDefault
handler:nil]];
[self presentViewController:alertController animated:YES completion:nil];
}
@end
@@ -25,7 +25,7 @@
#import "XLForm.h"
#import "SelectorsFormViewController.h"
#import "MultiValuedFormViewController.h"
#import "MultivaluedFormViewController.h"
@implementation MultivaluedFormViewController
@@ -85,95 +85,45 @@
-(void)addDidTouch:(UIBarButtonItem * __unused)sender
{
#if __IPHONE_OS_VERSION_MAX_ALLOWED < 80000
UIActionSheet * actionSheet = [[UIActionSheet alloc] initWithTitle:nil
delegate:self
cancelButtonTitle:NSLocalizedString(@"Cancel")
destructiveButtonTitle:@"Remove Last Section"
otherButtonTitles:@"Add a section at the end", self.form.isDisabled ? @"Enable Form" : @"Disable Form", nil];
[actionSheet showInView:self.view];
#else
if ([UIAlertController class]){
UIAlertController * alertController = [UIAlertController alertControllerWithTitle:nil
message:nil
preferredStyle:UIAlertControllerStyleActionSheet];
[alertController addAction:[UIAlertAction actionWithTitle:NSLocalizedString(@"Cancel", nil)
style:UIAlertActionStyleCancel
handler:nil]];
__weak __typeof(self)weakSelf = self;
[alertController addAction:[UIAlertAction actionWithTitle:@"Remove Last Section"
style:UIAlertActionStyleDestructive
handler:^(UIAlertAction *action) {
if (weakSelf.form.formSections.count > 0){
// remove last section
[weakSelf.form removeFormSectionAtIndex:(weakSelf.form.formSections.count - 1)];
}
}]];
[alertController addAction:[UIAlertAction actionWithTitle:@"Add a section at the end"
style:UIAlertActionStyleDefault
handler:^(UIAlertAction *action) {
// add a new section
XLFormSectionDescriptor * newSection = [XLFormSectionDescriptor formSectionWithTitle:[NSString stringWithFormat:@"Section created at %@", [NSDateFormatter localizedStringFromDate:[NSDate new] dateStyle:NSDateFormatterShortStyle timeStyle:NSDateFormatterShortStyle]] sectionOptions:XLFormSectionOptionCanInsert | XLFormSectionOptionCanDelete];
newSection.multivaluedTag = [NSString stringWithFormat:@"multivaluedPushSelector_%@", @(weakSelf.form.formSections.count)];
XLFormRowDescriptor * newRow = [XLFormRowDescriptor formRowDescriptorWithTag:nil rowType:XLFormRowDescriptorTypeSelectorPush title:@"Tap to select ;).."];
newRow.selectorOptions = @[@"Option 1", @"Option 2", @"Option 3"];
[newSection addFormRow:newRow];
[weakSelf.form addFormSection:newSection];
}]];
[alertController addAction:[UIAlertAction actionWithTitle:self.form.isDisabled ? @"Enable Form" : @"Disable Form"
style:UIAlertActionStyleDefault
handler:^(UIAlertAction *action) {
weakSelf.form.disabled = !weakSelf.form.disabled;
[weakSelf.tableView endEditing:YES];
[weakSelf.tableView reloadData];
}]];
[self presentViewController:alertController animated:YES completion:nil];
}
else{
UIActionSheet * actionSheet = [[UIActionSheet alloc] initWithTitle:nil
delegate:self
cancelButtonTitle:NSLocalizedString(@"Cancel", nil)
destructiveButtonTitle:@"Remove Last Section"
otherButtonTitles:@"Add a section at the end", self.form.isDisabled ? @"Enable Form" : @"Disable Form", nil];
[actionSheet showInView:self.view];
}
#endif
UIAlertController * alertController = [UIAlertController alertControllerWithTitle:nil
message:nil
preferredStyle:UIAlertControllerStyleActionSheet];
[alertController addAction:[UIAlertAction actionWithTitle:NSLocalizedString(@"Cancel", nil)
style:UIAlertActionStyleCancel
handler:nil]];
__weak __typeof(self)weakSelf = self;
[alertController addAction:[UIAlertAction actionWithTitle:@"Remove Last Section"
style:UIAlertActionStyleDestructive
handler:^(UIAlertAction *action) {
if (weakSelf.form.formSections.count > 0){
// remove last section
[weakSelf.form removeFormSectionAtIndex:(weakSelf.form.formSections.count - 1)];
}
}]];
[alertController addAction:[UIAlertAction actionWithTitle:@"Add a section at the end"
style:UIAlertActionStyleDefault
handler:^(UIAlertAction *action) {
// add a new section
XLFormSectionDescriptor * newSection = [XLFormSectionDescriptor formSectionWithTitle:[NSString stringWithFormat:@"Section created at %@", [NSDateFormatter localizedStringFromDate:[NSDate new] dateStyle:NSDateFormatterShortStyle timeStyle:NSDateFormatterShortStyle]] sectionOptions:XLFormSectionOptionCanInsert | XLFormSectionOptionCanDelete];
newSection.multivaluedTag = [NSString stringWithFormat:@"multivaluedPushSelector_%@", @(weakSelf.form.formSections.count)];
XLFormRowDescriptor * newRow = [XLFormRowDescriptor formRowDescriptorWithTag:nil rowType:XLFormRowDescriptorTypeSelectorPush title:@"Tap to select ;).."];
newRow.selectorOptions = @[@"Option 1", @"Option 2", @"Option 3"];
[newSection addFormRow:newRow];
[weakSelf.form addFormSection:newSection];
}]];
[alertController addAction:[UIAlertAction actionWithTitle:self.form.isDisabled ? @"Enable Form" : @"Disable Form"
style:UIAlertActionStyleDefault
handler:^(UIAlertAction *action) {
weakSelf.form.disabled = !weakSelf.form.disabled;
[weakSelf.tableView endEditing:YES];
[weakSelf.tableView reloadData];
}]];
[self presentViewController:alertController animated:YES completion:nil];
}
#if __IPHONE_OS_VERSION_MIN_REQUIRED < 80000
#pragma mark - UIActionSheetDelegate
- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
{
if ([actionSheet destructiveButtonIndex] == buttonIndex){
if (self.form.formSections.count > 0){
// remove last section
[self.form removeFormSectionAtIndex:(self.form.formSections.count - 1)];
}
}
else if ([[actionSheet buttonTitleAtIndex:buttonIndex] isEqualToString:@"Add a section at the end"]){
// add a new section
XLFormSectionDescriptor * newSection = [XLFormSectionDescriptor formSectionWithTitle:[NSString stringWithFormat:@"Section created at %@", [NSDateFormatter localizedStringFromDate:[NSDate new] dateStyle:NSDateFormatterShortStyle timeStyle:NSDateFormatterShortStyle]] sectionOptions:XLFormSectionOptionCanInsert | XLFormSectionOptionCanDelete];
newSection.multivaluedTag = [NSString stringWithFormat:@"multivaluedPushSelector_%@", @(self.form.formSections.count)];
XLFormRowDescriptor * newRow = [XLFormRowDescriptor formRowDescriptorWithTag:nil rowType:XLFormRowDescriptorTypeSelectorPush title:@"Tap to select ;).."];
newRow.selectorOptions = @[@"Option 1", @"Option 2", @"Option 3"];
[newSection addFormRow:newRow];
[self.form addFormSection:newSection];
}
else if (![[actionSheet buttonTitleAtIndex:buttonIndex] isEqualToString:NSLocalizedString(@"Cancel")]){
self.form.disabled = !self.form.disabled;
[self.tableView endEditing:YES];
[self.tableView reloadData];
}
}
#endif
@end
@@ -32,7 +32,7 @@
NSString *const kFormImageSelectorCellDefaultImage = @"defaultImage";
NSString *const kFormImageSelectorCellImageRequest = @"imageRequest";
@interface XLFormImageSelectorCell() <UIActionSheetDelegate, UINavigationControllerDelegate, UIImagePickerControllerDelegate>
@interface XLFormImageSelectorCell() <UINavigationControllerDelegate, UIImagePickerControllerDelegate>
@property (nonatomic) UIImage * defaultImage;
@property (nonatomic) NSURLRequest * imageRequest;
@@ -92,57 +92,36 @@ NSString *const kFormImageSelectorCellImageRequest = @"imageRequest";
-(void)formDescriptorCellDidSelectedWithFormController:(XLFormViewController *)controller
{
#if __IPHONE_OS_VERSION_MAX_ALLOWED < 80000
UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:self.rowDescriptor.selectorTitle
delegate:self
cancelButtonTitle:NSLocalizedString(@"Cancel", nil)
destructiveButtonTitle:nil
otherButtonTitles:NSLocalizedString(@"XLFormImageSelectorCell_ChooseExistingPhoto", @"Choose Existing Photo"), NSLocalizedString(@"XLFormImageSelectorCell_TakePicture", @"Take a Picture"), nil];
actionSheet.tag = self.tag;
[actionSheet showInView:self.formViewController.view];
#else
if ([UIAlertController class]) {
UIAlertController * alertController = [UIAlertController alertControllerWithTitle:self.rowDescriptor.selectorTitle
message:nil
preferredStyle:UIAlertControllerStyleActionSheet];
[alertController addAction:[UIAlertAction actionWithTitle:NSLocalizedString(@"Cancel", nil)
style:UIAlertActionStyleCancel
handler:nil]];
__weak __typeof(self)weakSelf = self;
[alertController addAction:[UIAlertAction actionWithTitle:NSLocalizedString(@"XLFormImageSelectorCell_ChooseExistingPhoto", @"Choose Existing Photo")
style:UIAlertActionStyleDefault
handler:^(UIAlertAction *action) {
UIImagePickerController * imagePickerController = [[UIImagePickerController alloc] init];
imagePickerController.delegate = weakSelf;
imagePickerController.allowsEditing = YES;
imagePickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
imagePickerController.mediaTypes = @[(NSString *)kUTTypeImage];
[weakSelf.formViewController presentViewController:imagePickerController animated:YES completion:nil];
}]];
[alertController addAction:[UIAlertAction actionWithTitle:NSLocalizedString(@"XLFormImageSelectorCell_TakePicture", @"Take a Picture")
style:UIAlertActionStyleDefault
handler:^(UIAlertAction *action) {
UIImagePickerController * imagePickerController = [[UIImagePickerController alloc] init];
imagePickerController.delegate = weakSelf;
imagePickerController.allowsEditing = YES;
imagePickerController.sourceType = UIImagePickerControllerSourceTypeCamera;
imagePickerController.mediaTypes = @[(NSString *)kUTTypeImage];
[weakSelf.formViewController presentViewController:imagePickerController animated:YES completion:nil];
}]];
[self.formViewController presentViewController:alertController animated:YES completion:nil];
}
else{
UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:self.rowDescriptor.selectorTitle
delegate:self
cancelButtonTitle:NSLocalizedString(@"Cancel", nil)
destructiveButtonTitle:nil
otherButtonTitles:NSLocalizedString(@"XLFormImageSelectorCell_ChooseExistingPhoto", @"Choose Existing Photo"), NSLocalizedString(@"XLFormImageSelectorCell_TakePicture", @"Take a Picture"), nil];
actionSheet.tag = self.tag;
[actionSheet showInView:self.formViewController.view];
}
#endif
UIAlertController * alertController = [UIAlertController alertControllerWithTitle:self.rowDescriptor.selectorTitle
message:nil
preferredStyle:UIAlertControllerStyleActionSheet];
[alertController addAction:[UIAlertAction actionWithTitle:NSLocalizedString(@"Cancel", nil)
style:UIAlertActionStyleCancel
handler:nil]];
__weak __typeof(self)weakSelf = self;
[alertController addAction:[UIAlertAction actionWithTitle:NSLocalizedString(@"XLFormImageSelectorCell_ChooseExistingPhoto", @"Choose Existing Photo")
style:UIAlertActionStyleDefault
handler:^(UIAlertAction *action) {
UIImagePickerController * imagePickerController = [[UIImagePickerController alloc] init];
imagePickerController.delegate = weakSelf;
imagePickerController.allowsEditing = YES;
imagePickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
imagePickerController.mediaTypes = @[(NSString *)kUTTypeImage];
[weakSelf.formViewController presentViewController:imagePickerController animated:YES completion:nil];
}]];
[alertController addAction:[UIAlertAction actionWithTitle:NSLocalizedString(@"XLFormImageSelectorCell_TakePicture", @"Take a Picture")
style:UIAlertActionStyleDefault
handler:^(UIAlertAction *action) {
UIImagePickerController * imagePickerController = [[UIImagePickerController alloc] init];
imagePickerController.delegate = weakSelf;
imagePickerController.allowsEditing = YES;
imagePickerController.sourceType = UIImagePickerControllerSourceTypeCamera;
imagePickerController.mediaTypes = @[(NSString *)kUTTypeImage];
[weakSelf.formViewController presentViewController:imagePickerController animated:YES completion:nil];
}]];
[self.formViewController presentViewController:alertController animated:YES completion:nil];
}
#pragma mark - LayoutConstraints
@@ -213,32 +192,6 @@ NSString *const kFormImageSelectorCellImageRequest = @"imageRequest";
[self.textLabel removeObserver:self forKeyPath:@"text"];
}
#if __IPHONE_OS_VERSION_MIN_REQUIRED < 80000
#pragma mark - UIActionSheetDelegate
- (void)actionSheet:(UIActionSheet * __unused)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
{
UIImagePickerController * imagePickerController = [[UIImagePickerController alloc] init];
imagePickerController.delegate = self;
imagePickerController.allowsEditing = YES;
if (buttonIndex == 0){
imagePickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
imagePickerController.mediaTypes = @[(NSString *)kUTTypeImage];
[self.formViewController presentViewController:imagePickerController animated:YES completion:nil];
}
else if (buttonIndex == 1){
imagePickerController.sourceType = UIImagePickerControllerSourceTypeCamera;
imagePickerController.mediaTypes = @[(NSString *)kUTTypeImage];
[self.formViewController presentViewController:imagePickerController animated:YES completion:nil];
}
}
#endif
#pragma mark - UIImagePickerControllerDelegate
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
@@ -134,32 +134,13 @@ NSString *const kButtonWithStoryboardId = @"buttonWithStoryboardId";
__typeof(self) __weak weakSelf = self;
buttonLeftAlignedRow.action.formBlock = ^(XLFormRowDescriptor * sender){
if ([[sender.sectionDescriptor.formDescriptor formRowWithTag:kSwitchBool].value boolValue]){
#if __IPHONE_OS_VERSION_MAX_ALLOWED < 80000
UIAlertView *message = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Switch is ON", nil)
message:@"Button has checked the switch value..."
delegate:weakSelf
cancelButtonTitle:NSLocalizedString(@"OK", nil)
otherButtonTitles:nil];
[message show];
#else
if ([UIAlertController class]) {
UIAlertController * alertController = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Switch is ON", nil)
message:@"Button has checked the switch value..."
preferredStyle:UIAlertControllerStyleAlert];
[alertController addAction:[UIAlertAction actionWithTitle:NSLocalizedString(@"OK", nil)
style:UIAlertActionStyleDefault
handler:nil]];
[self presentViewController:alertController animated:YES completion:nil];
}
else{
UIAlertView *message = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Switch is ON", nil)
message:@"Button has checked the switch value..."
delegate:weakSelf
cancelButtonTitle:NSLocalizedString(@"OK", nil)
otherButtonTitles:nil];
[message show];
}
#endif
UIAlertController * alertController = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Switch is ON", nil)
message:@"Button has checked the switch value..."
preferredStyle:UIAlertControllerStyleAlert];
[alertController addAction:[UIAlertAction actionWithTitle:NSLocalizedString(@"OK", nil)
style:UIAlertActionStyleDefault
handler:nil]];
[self presentViewController:alertController animated:YES completion:nil];
}
[weakSelf deselectFormRow:sender];
};
@@ -196,33 +177,13 @@ NSString *const kButtonWithStoryboardId = @"buttonWithStoryboardId";
-(void)didTouchButton:(XLFormRowDescriptor *)sender
{
if ([[sender.sectionDescriptor.formDescriptor formRowWithTag:kSwitchBool].value boolValue]){
#if __IPHONE_OS_VERSION_MAX_ALLOWED < 80000
UIAlertView *message = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Switch is ON", nil)
message:@"Button has checked the switch value..."
delegate:self
cancelButtonTitle:NSLocalizedString(@"OK", nil)
otherButtonTitles:nil];
[message show];
#else
if ([UIAlertController class]) {
UIAlertController * alertController = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Switch is ON", nil)
message:@"Button has checked the switch value..."
preferredStyle:UIAlertControllerStyleAlert];
[alertController addAction:[UIAlertAction actionWithTitle:NSLocalizedString(@"OK", nil)
style:UIAlertActionStyleDefault
handler:nil]];
[self presentViewController:alertController animated:YES completion:nil];
}
else{
UIAlertView *message = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Switch is ON", nil)
message:@"Button has checked the switch value..."
delegate:self
cancelButtonTitle:NSLocalizedString(@"OK", nil)
otherButtonTitles:nil];
[message show];
}
#endif
UIAlertController * alertController = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Switch is ON", nil)
message:@"Button has checked the switch value..."
preferredStyle:UIAlertControllerStyleAlert];
[alertController addAction:[UIAlertAction actionWithTitle:NSLocalizedString(@"OK", nil)
style:UIAlertActionStyleDefault
handler:nil]];
[self presentViewController:alertController animated:YES completion:nil];
}
[self deselectFormRow:sender];
}
@@ -89,7 +89,7 @@
MKPinAnnotationView *pinAnnotationView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation
reuseIdentifier:@"annotation"];
pinAnnotationView.pinColor = MKPinAnnotationColorRed;
pinAnnotationView.pinTintColor = [UIColor redColor];
pinAnnotationView.draggable = YES;
pinAnnotationView.animatesDrop = YES;
return pinAnnotationView;
@@ -26,9 +26,9 @@
#import "XLFormRowDescriptor.h"
#import "XLRemoteDataStoreController.h"
@interface UsersTableViewController : XLRemoteDataStoreController <XLFormRowDescriptorViewController, XLFormRowDescriptorPopoverViewController>
@interface UsersTableViewController : XLRemoteDataStoreController <XLFormRowDescriptorViewController>
@property BOOL isSearchResultsController;
@property NSLayoutConstraint *topConstraint;
@end
@end
@@ -124,7 +124,6 @@
@implementation UsersTableViewController
@synthesize rowDescriptor = _rowDescriptor;
@synthesize popoverController = __popoverController;
@synthesize searchController = _searchController;
@synthesize searchResultController = _searchResultController;
@@ -205,15 +204,16 @@ static NSString *const kCellIdentifier = @"CellIdentifier";
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
NSDictionary *dataItem = [self.dataStore dataAtIndexPath:indexPath];
self.rowDescriptor.value = dataItem;
if (self.popoverController){
[self.popoverController dismissPopoverAnimated:YES];
[self.popoverController.delegate popoverControllerDidDismissPopover:self.popoverController];
}
else if ([self.parentViewController isKindOfClass:[UINavigationController class]]){
UIViewController *popoverController = self.presentedViewController;
if (popoverController && popoverController.modalPresentationStyle == UIModalPresentationPopover) {
[self dismissViewControllerAnimated:YES completion:nil];
} else if ([self.parentViewController isKindOfClass:[UINavigationController class]]) {
[self.navigationController popViewControllerAnimated:YES];
} else if ([self.presentingViewController isKindOfClass:[UsersTableViewController class]]) {
[[self.presentingViewController navigationController] popViewControllerAnimated:YES];
}
}
@@ -243,10 +243,12 @@ static NSString *const kCellIdentifier = @"CellIdentifier";
-(UsersTableViewController *)searchResultController
{
if (_searchResultController) return _searchResultController;
_searchResultController = [[UsersTableViewController alloc]init];
UsersTableViewController *usersViewController = [[UsersTableViewController alloc] init];
usersViewController.rowDescriptor = self.rowDescriptor;
_searchResultController = usersViewController;
_searchResultController.dataLoader.limit = 0; // no paging in search result
_searchResultController.isSearchResultsController = YES;
return _searchResultController;
}
@end
@end
@@ -1,8 +1,10 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="9059" systemVersion="15B42" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" initialViewController="p4n-1v-pzo">
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="14865.1" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" colorMatched="YES" initialViewController="p4n-1v-pzo">
<device id="retina6_1" orientation="portrait" appearance="light"/>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="9049"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14819.2"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
<!--Navigation Controller-->
@@ -11,9 +13,8 @@
<navigationController automaticallyAdjustsScrollViewInsets="NO" id="p4n-1v-pzo" sceneMemberID="viewController">
<toolbarItems/>
<navigationBar key="navigationBar" contentMode="scaleToFill" id="SNt-hk-N3V">
<rect key="frame" x="0.0" y="0.0" width="320" height="44"/>
<rect key="frame" x="0.0" y="44" width="414" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<animations/>
</navigationBar>
<nil name="viewControllers"/>
<connections>
@@ -22,7 +23,7 @@
</navigationController>
<placeholder placeholderIdentifier="IBFirstResponder" id="jqF-cF-u4f" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="117" y="56"/>
<point key="canvasLocation" x="-3" y="38"/>
</scene>
<!--Others Form View Controller-->
<scene sceneID="dyJ-7m-RaD">
@@ -33,10 +34,9 @@
<viewControllerLayoutGuide type="bottom" id="HPb-Nx-E1G"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="wpr-wE-9nj">
<rect key="frame" x="0.0" y="64" width="320" height="504"/>
<rect key="frame" x="0.0" y="0.0" width="414" height="808"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<animations/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</view>
<extendedEdge key="edgesForExtendedLayout" bottom="YES"/>
<navigationItem key="navigationItem" id="Hf0-cB-ORN"/>
@@ -46,7 +46,7 @@
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="7YZ-ZR-X81" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="1533" y="-233"/>
<point key="canvasLocation" x="2221.739130434783" y="-156.02678571428569"/>
</scene>
<!--Native Event Form View Controller-->
<scene sceneID="EjT-rm-U3h">
@@ -57,17 +57,15 @@
<viewControllerLayoutGuide type="bottom" id="QuR-kY-o5R"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="tun-QW-CGC">
<rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
<rect key="frame" x="0.0" y="0.0" width="414" height="842"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="grouped" separatorStyle="default" rowHeight="44" sectionHeaderHeight="10" sectionFooterHeight="10" translatesAutoresizingMaskIntoConstraints="NO" id="JY7-WL-SnH">
<rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
<animations/>
<rect key="frame" x="0.0" y="0.0" width="414" height="808"/>
<color key="backgroundColor" cocoaTouchSystemColor="groupTableViewBackgroundColor"/>
</tableView>
</subviews>
<animations/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<constraints>
<constraint firstItem="JY7-WL-SnH" firstAttribute="leading" secondItem="tun-QW-CGC" secondAttribute="leading" id="bSe-SV-rx6"/>
<constraint firstAttribute="trailing" secondItem="JY7-WL-SnH" secondAttribute="trailing" id="jLI-68-pSq"/>
@@ -82,7 +80,7 @@
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="zV0-mq-irv" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="1120" y="-635"/>
<point key="canvasLocation" x="1623.1884057971015" y="-425.22321428571428"/>
</scene>
<!--Examples-->
<scene sceneID="wf7-ha-lXx">
@@ -93,17 +91,15 @@
<viewControllerLayoutGuide type="bottom" id="0bE-2H-tqE"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="PO9-pF-A7O">
<rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="grouped" separatorStyle="default" rowHeight="44" sectionHeaderHeight="10" sectionFooterHeight="10" translatesAutoresizingMaskIntoConstraints="NO" id="Lxj-Sb-kC6">
<rect key="frame" x="0.0" y="64" width="320" height="504"/>
<animations/>
<rect key="frame" x="0.0" y="88" width="414" height="774"/>
<color key="backgroundColor" cocoaTouchSystemColor="groupTableViewBackgroundColor"/>
</tableView>
</subviews>
<animations/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<constraints>
<constraint firstItem="Lxj-Sb-kC6" firstAttribute="top" secondItem="kOR-67-djF" secondAttribute="bottom" id="PT1-Xo-3Ql"/>
<constraint firstAttribute="trailing" secondItem="Lxj-Sb-kC6" secondAttribute="trailing" id="brq-yF-WM8"/>
@@ -125,7 +121,7 @@
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="1V5-DZ-WfF" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="527" y="56"/>
<point key="canvasLocation" x="763.768115942029" y="37.5"/>
</scene>
<!--Blog Example View Controller-->
<scene sceneID="Vn0-9y-5bc">
@@ -136,17 +132,16 @@
<viewControllerLayoutGuide type="bottom" id="scM-da-Sg0"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="hrV-fb-58s">
<rect key="frame" x="0.0" y="64" width="320" height="504"/>
<rect key="frame" x="0.0" y="0.0" width="414" height="808"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<animations/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</view>
<extendedEdge key="edgesForExtendedLayout" bottom="YES"/>
<navigationItem key="navigationItem" id="RJB-cz-SnF"/>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="Fvo-wr-5Ca" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="167" y="1151"/>
<point key="canvasLocation" x="242.0289855072464" y="770.75892857142856"/>
</scene>
<!--Validation Examples-->
<scene sceneID="z2I-Nk-y9W">
@@ -157,17 +152,15 @@
<viewControllerLayoutGuide type="bottom" id="xtJ-Wo-mhU"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="1Ol-Ra-Ysg">
<rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="grouped" separatorStyle="default" rowHeight="44" sectionHeaderHeight="10" sectionFooterHeight="10" translatesAutoresizingMaskIntoConstraints="NO" id="Fty-3j-BeF">
<rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
<animations/>
<rect key="frame" x="0.0" y="24" width="414" height="838"/>
<color key="backgroundColor" cocoaTouchSystemColor="groupTableViewBackgroundColor"/>
</tableView>
</subviews>
<animations/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<constraints>
<constraint firstItem="xtJ-Wo-mhU" firstAttribute="top" secondItem="Fty-3j-BeF" secondAttribute="bottom" id="CbV-4f-RzP"/>
<constraint firstItem="Fty-3j-BeF" firstAttribute="top" secondItem="AG9-N9-2qp" secondAttribute="bottom" constant="-64" id="Pdw-VG-qcc"/>
@@ -184,7 +177,7 @@
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="VFT-Og-STO" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="566" y="938"/>
<point key="canvasLocation" x="820.28985507246387" y="628.125"/>
</scene>
<!--Predicate Form View Controller-->
<scene sceneID="a9p-C8-g8y">
@@ -195,17 +188,16 @@
<viewControllerLayoutGuide type="bottom" id="Lsg-dH-McH"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="6EZ-O7-FjX">
<rect key="frame" x="0.0" y="64" width="320" height="504"/>
<rect key="frame" x="0.0" y="0.0" width="414" height="808"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<animations/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</view>
<extendedEdge key="edgesForExtendedLayout" bottom="YES"/>
<navigationItem key="navigationItem" id="Lsd-xH-7IN"/>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="rZL-10-YZn" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="956" y="924"/>
<point key="canvasLocation" x="1385.5072463768117" y="618.75"/>
</scene>
<!--Selectors Form View Controller-->
<scene sceneID="KYK-TX-8rm">
@@ -216,10 +208,9 @@
<viewControllerLayoutGuide type="bottom" id="CTu-Y5-7Qw"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="bNj-SD-83w">
<rect key="frame" x="0.0" y="64" width="320" height="504"/>
<rect key="frame" x="0.0" y="0.0" width="414" height="808"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<animations/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</view>
<extendedEdge key="edgesForExtendedLayout" bottom="YES"/>
<navigationItem key="navigationItem" id="Buo-Af-6Q1"/>
@@ -229,7 +220,7 @@
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="8fu-YK-6qz" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="1346" y="533"/>
<point key="canvasLocation" x="1950.7246376811595" y="356.91964285714283"/>
</scene>
<!--Map View Controller-->
<scene sceneID="tAS-lK-35t">
@@ -240,17 +231,16 @@
<viewControllerLayoutGuide type="bottom" id="cgQ-Vs-ICN"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="JjC-E5-SyY">
<rect key="frame" x="0.0" y="64" width="320" height="504"/>
<rect key="frame" x="0.0" y="0.0" width="414" height="808"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<animations/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</view>
<extendedEdge key="edgesForExtendedLayout" bottom="YES"/>
<navigationItem key="navigationItem" id="BjG-Bq-0lD"/>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="LmS-YR-mFY" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="1789" y="533"/>
<point key="canvasLocation" x="2592.753623188406" y="356.91964285714283"/>
</scene>
<!--Native Event Navigation View Controller-->
<scene sceneID="mNb-be-ApA">
@@ -258,9 +248,8 @@
<navigationController automaticallyAdjustsScrollViewInsets="NO" id="K9D-4c-9eZ" customClass="NativeEventNavigationViewController" sceneMemberID="viewController">
<toolbarItems/>
<navigationBar key="navigationBar" contentMode="scaleToFill" id="fO3-V7-XXu">
<rect key="frame" x="0.0" y="0.0" width="320" height="44"/>
<rect key="frame" x="0.0" y="0.0" width="414" height="56"/>
<autoresizingMask key="autoresizingMask"/>
<animations/>
</navigationBar>
<nil name="viewControllers"/>
<connections>
@@ -269,7 +258,7 @@
</navigationController>
<placeholder placeholderIdentifier="IBFirstResponder" id="eqB-vl-BzH" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="586" y="-654"/>
<point key="canvasLocation" x="849.27536231884062" y="-437.94642857142856"/>
</scene>
<!--Basic Predicate View Controller-->
<scene sceneID="pD4-sm-x3a">
@@ -280,17 +269,16 @@
<viewControllerLayoutGuide type="bottom" id="2b4-gN-85p"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="NZg-t1-g19">
<rect key="frame" x="0.0" y="64" width="320" height="504"/>
<rect key="frame" x="0.0" y="0.0" width="414" height="808"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<animations/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</view>
<extendedEdge key="edgesForExtendedLayout" bottom="YES"/>
<navigationItem key="navigationItem" id="1lh-jZ-lIV"/>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="Tlw-q2-pcu" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="-159" y="1151"/>
<point key="canvasLocation" x="-230.43478260869566" y="770.75892857142856"/>
</scene>
<!--Users Table View Controller-->
<scene sceneID="lGi-0L-kUk">
@@ -301,17 +289,15 @@
<viewControllerLayoutGuide type="bottom" id="uVG-bI-IMr"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="sMH-hT-NCg">
<rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<tableView autoresizesSubviews="NO" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="grouped" separatorStyle="default" rowHeight="44" sectionHeaderHeight="10" sectionFooterHeight="10" translatesAutoresizingMaskIntoConstraints="NO" id="fLo-Gu-rqr">
<rect key="frame" x="0.0" y="20" width="320" height="548"/>
<animations/>
<rect key="frame" x="0.0" y="44" width="414" height="818"/>
<color key="backgroundColor" cocoaTouchSystemColor="groupTableViewBackgroundColor"/>
</tableView>
</subviews>
<animations/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<constraints>
<constraint firstItem="uVG-bI-IMr" firstAttribute="top" secondItem="fLo-Gu-rqr" secondAttribute="bottom" id="25A-HG-wek"/>
<constraint firstItem="fLo-Gu-rqr" firstAttribute="top" secondItem="at2-Ds-EcY" secondAttribute="bottom" id="3N4-a2-LLf"/>
@@ -326,7 +312,7 @@
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="flB-2M-8zS" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="1346" y="1178"/>
<point key="canvasLocation" x="1950.7246376811595" y="788.83928571428567"/>
</scene>
</scenes>
<inferredMetricsTieBreakers>
+2 -2
View File
@@ -1,5 +1,5 @@
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '8.0'
platform :ios, '9.0'
target 'XLForm' do
@@ -11,4 +11,4 @@ pod 'XLData', :git => 'https://github.com/xmartlabs/XLData.git', :commit => '1f9
pod 'JVFloatLabeledTextField', '1.0.2', :inhibit_warnings => true
pod 'AXRatingView', '1.0.3', :inhibit_warnings => true
pod 'SHSPhoneComponent'
end
end
+12 -5
View File
@@ -43,7 +43,7 @@ PODS:
- XLData/RemoteDataStore (2.0.0):
- XLData/CoreRemote
- XLData/DataStore
- XLForm (3.1.2)
- XLForm (4.2.0)
DEPENDENCIES:
- AFNetworking (~> 2.0)
@@ -53,12 +53,19 @@ DEPENDENCIES:
- XLData (from `https://github.com/xmartlabs/XLData.git`, commit `1f9019b56242a2019c7f7e11ec4ef823c397ebcf`)
- XLForm (from `../../`)
SPEC REPOS:
https://github.com/CocoaPods/Specs.git:
- AFNetworking
- AXRatingView
- JVFloatLabeledTextField
- SHSPhoneComponent
EXTERNAL SOURCES:
XLData:
:commit: 1f9019b56242a2019c7f7e11ec4ef823c397ebcf
:git: https://github.com/xmartlabs/XLData.git
XLForm:
:path: ../../
:path: "../../"
CHECKOUT OPTIONS:
XLData:
@@ -71,8 +78,8 @@ SPEC CHECKSUMS:
JVFloatLabeledTextField: 58a3a32cfb800e5b224f676987e7c13abf50a14d
SHSPhoneComponent: 4cec0653a150ad63cbc52b0c8b29ce2d3c9c26f0
XLData: df725c6179e2e0c80bf56a1ecad9afd169707a6d
XLForm: 6bb3c20857e2983cf494cb8b4d666c2a24673d5e
XLForm: eb04ea4104f26250b70a72a7fa2eed3748dca5cd
PODFILE CHECKSUM: 80615792e859be64c95add3bb57c1596234faf95
PODFILE CHECKSUM: 64fbcd03a2c13762b2c18e3938cc8008807937c9
COCOAPODS: 1.0.0
COCOAPODS: 1.9.3
@@ -482,12 +482,11 @@
isa = PBXNativeTarget;
buildConfigurationList = 2850C62418D0F707002B7D0A /* Build configuration list for PBXNativeTarget "XLForm" */;
buildPhases = (
EBE0335CCC7588D83B89A92A /* 📦 Check Pods Manifest.lock */,
EBE0335CCC7588D83B89A92A /* [CP] Check Pods Manifest.lock */,
2850C5F418D0F706002B7D0A /* Sources */,
2850C5F518D0F706002B7D0A /* Frameworks */,
2850C5F618D0F706002B7D0A /* Resources */,
32EB30E0A90A4E91864B1D3C /* 📦 Embed Pods Frameworks */,
DE3D12F5596780A66C6C3D4A /* 📦 Copy Pods Resources */,
DE3D12F5596780A66C6C3D4A /* [CP] Copy Pods Resources */,
);
buildRules = (
);
@@ -504,7 +503,7 @@
2850C5F018D0F706002B7D0A /* Project object */ = {
isa = PBXProject;
attributes = {
LastUpgradeCheck = 0700;
LastUpgradeCheck = 1100;
ORGANIZATIONNAME = Xmartlabs;
};
buildConfigurationList = 2850C5F318D0F706002B7D0A /* Build configuration list for PBXProject "XLForm" */;
@@ -512,6 +511,7 @@
developmentRegion = English;
hasScannedForEncodings = 0;
knownRegions = (
English,
en,
);
mainGroup = 2850C5EF18D0F706002B7D0A;
@@ -542,49 +542,40 @@
/* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
32EB30E0A90A4E91864B1D3C /* 📦 Embed Pods Frameworks */ = {
DE3D12F5596780A66C6C3D4A /* [CP] Copy Pods Resources */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
"${PODS_ROOT}/Target Support Files/Pods-XLForm/Pods-XLForm-resources.sh",
"${PODS_ROOT}/../../../XLForm/XLForm.bundle",
);
name = "📦 Embed Pods Frameworks";
name = "[CP] Copy Pods Resources";
outputPaths = (
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/XLForm.bundle",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-XLForm/Pods-XLForm-frameworks.sh\"\n";
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-XLForm/Pods-XLForm-resources.sh\"\n";
showEnvVarsInLog = 0;
};
DE3D12F5596780A66C6C3D4A /* 📦 Copy Pods Resources */ = {
EBE0335CCC7588D83B89A92A /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
"${PODS_ROOT}/Manifest.lock",
);
name = "📦 Copy Pods Resources";
name = "[CP] Check Pods Manifest.lock";
outputPaths = (
"$(DERIVED_FILE_DIR)/Pods-XLForm-checkManifestLockResult.txt",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-XLForm/Pods-XLForm-resources.sh\"\n";
showEnvVarsInLog = 0;
};
EBE0335CCC7588D83B89A92A /* 📦 Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
);
name = "📦 Check Pods Manifest.lock";
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n exit 1\nfi\n";
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
/* End PBXShellScriptBuildPhase section */
@@ -654,23 +645,37 @@
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
@@ -683,7 +688,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
};
@@ -693,29 +698,43 @@
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = YES;
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
SDKROOT = iphoneos;
VALIDATE_PRODUCT = YES;
};
@@ -730,7 +749,7 @@
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "XLForm/XLForm-Prefix.pch";
INFOPLIST_FILE = "XLForm/XLForm-Info.plist";
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
PRODUCT_BUNDLE_IDENTIFIER = "com.xmartlabs.$(PRODUCT_NAME:rfc1034identifier)";
PRODUCT_NAME = "$(TARGET_NAME)";
TARGETED_DEVICE_FAMILY = "1,2";
@@ -748,7 +767,7 @@
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "XLForm/XLForm-Prefix.pch";
INFOPLIST_FILE = "XLForm/XLForm-Info.plist";
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
PRODUCT_BUNDLE_IDENTIFIER = "com.xmartlabs.$(PRODUCT_NAME:rfc1034identifier)";
PRODUCT_NAME = "$(TARGET_NAME)";
TARGETED_DEVICE_FAMILY = "1,2";
@@ -1,5 +1,15 @@
{
"images" : [
{
"idiom" : "iphone",
"size" : "20x20",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "20x20",
"scale" : "3x"
},
{
"idiom" : "iphone",
"size" : "29x29",
@@ -48,6 +58,16 @@
"size" : "60x60",
"scale" : "3x"
},
{
"idiom" : "ipad",
"size" : "20x20",
"scale" : "1x"
},
{
"idiom" : "ipad",
"size" : "20x20",
"scale" : "2x"
},
{
"idiom" : "ipad",
"size" : "29x29",
@@ -101,8 +121,13 @@
"scale" : "2x"
},
{
"idiom" : "car",
"size" : "120x120",
"idiom" : "ipad",
"size" : "83.5x83.5",
"scale" : "2x"
},
{
"idiom" : "ios-marketing",
"size" : "1024x1024",
"scale" : "1x"
},
{
@@ -142,8 +167,15 @@
"size" : "44x44",
"idiom" : "watch",
"scale" : "2x",
"role" : "longLook",
"subtype" : "42mm"
"role" : "appLauncher",
"subtype" : "40mm"
},
{
"size" : "50x50",
"idiom" : "watch",
"scale" : "2x",
"role" : "appLauncher",
"subtype" : "44mm"
},
{
"size" : "86x86",
@@ -158,6 +190,30 @@
"scale" : "2x",
"role" : "quickLook",
"subtype" : "42mm"
},
{
"size" : "108x108",
"idiom" : "watch",
"scale" : "2x",
"role" : "quickLook",
"subtype" : "44mm"
},
{
"idiom" : "watch-marketing",
"size" : "1024x1024",
"scale" : "1x"
},
{
"idiom" : "car",
"size" : "120x120",
"scale" : "1x"
},
{
"size" : "44x44",
"idiom" : "watch",
"scale" : "2x",
"role" : "longLook",
"subtype" : "42mm"
}
],
"info" : {
+1 -1
View File
@@ -1,4 +1,4 @@
platform :ios, '8.0'
platform :ios, '9.0'
target 'SwiftExample' do
@@ -38,8 +38,8 @@
28D8326C1AEC177E009E3B3F /* ValidationExamplesFormViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28D8326B1AEC177E009E3B3F /* ValidationExamplesFormViewController.swift */; };
28D8326F1AEC2D1B009E3B3F /* UICustomizationFormViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28D8326E1AEC2D1B009E3B3F /* UICustomizationFormViewController.swift */; };
28F490221AAFBBC600C8E0CC /* DatesFormViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28F490211AAFBBC600C8E0CC /* DatesFormViewController.swift */; };
649437BA8D5B7C59BBDB7B92 /* libPods-SwiftExample.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E006C7F7FF8E967AA8661BC9 /* libPods-SwiftExample.a */; };
BF01E92B1C21FF2800BDE045 /* InlineSegmentedCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF01E92A1C21FF2800BDE045 /* InlineSegmentedCell.swift */; };
DD7B43598E698717584375E9 /* libPods-SwiftExample.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 9CFB9BA3A82D5F6FE7CCE5A5 /* libPods-SwiftExample.a */; };
/* End PBXBuildFile section */
/* Begin PBXFileReference section */
@@ -77,10 +77,10 @@
28D8326B1AEC177E009E3B3F /* ValidationExamplesFormViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ValidationExamplesFormViewController.swift; sourceTree = "<group>"; };
28D8326E1AEC2D1B009E3B3F /* UICustomizationFormViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UICustomizationFormViewController.swift; sourceTree = "<group>"; };
28F490211AAFBBC600C8E0CC /* DatesFormViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = DatesFormViewController.swift; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.swift; };
2EB9C638FC2450A0B9786D1E /* Pods-SwiftExample.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SwiftExample.release.xcconfig"; path = "Pods/Target Support Files/Pods-SwiftExample/Pods-SwiftExample.release.xcconfig"; sourceTree = "<group>"; };
420D9BAB7B0D2AF9487DD060 /* Pods-SwiftExample.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SwiftExample.debug.xcconfig"; path = "Pods/Target Support Files/Pods-SwiftExample/Pods-SwiftExample.debug.xcconfig"; sourceTree = "<group>"; };
9CFB9BA3A82D5F6FE7CCE5A5 /* libPods-SwiftExample.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-SwiftExample.a"; sourceTree = BUILT_PRODUCTS_DIR; };
BF01E92A1C21FF2800BDE045 /* InlineSegmentedCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = InlineSegmentedCell.swift; path = InlineSegmentedCell/InlineSegmentedCell.swift; sourceTree = "<group>"; };
CD0A6F89B9CD5843CA297E52 /* Pods-SwiftExample.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SwiftExample.release.xcconfig"; path = "Pods/Target Support Files/Pods-SwiftExample/Pods-SwiftExample.release.xcconfig"; sourceTree = "<group>"; };
E006C7F7FF8E967AA8661BC9 /* libPods-SwiftExample.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-SwiftExample.a"; sourceTree = BUILT_PRODUCTS_DIR; };
F019783EE34BD17E2BA41467 /* Pods-SwiftExample.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SwiftExample.debug.xcconfig"; path = "Pods/Target Support Files/Pods-SwiftExample/Pods-SwiftExample.debug.xcconfig"; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@@ -88,7 +88,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
DD7B43598E698717584375E9 /* libPods-SwiftExample.a in Frameworks */,
649437BA8D5B7C59BBDB7B92 /* libPods-SwiftExample.a in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -100,8 +100,8 @@
children = (
2847A6A01AAF2679000A2ABE /* SwiftExample */,
2847A69F1AAF2679000A2ABE /* Products */,
7A12A831117D9B4D152E0A51 /* Pods */,
402AE3EC1FACD058DCF0A2D3 /* Frameworks */,
E9F3DD7ACEF5AAF92FCE6E24 /* Pods */,
3D93F92C6A8B49B82B452B67 /* Frameworks */,
);
sourceTree = "<group>";
};
@@ -324,23 +324,14 @@
path = SwiftExample/Dates;
sourceTree = SOURCE_ROOT;
};
402AE3EC1FACD058DCF0A2D3 /* Frameworks */ = {
3D93F92C6A8B49B82B452B67 /* Frameworks */ = {
isa = PBXGroup;
children = (
9CFB9BA3A82D5F6FE7CCE5A5 /* libPods-SwiftExample.a */,
E006C7F7FF8E967AA8661BC9 /* libPods-SwiftExample.a */,
);
name = Frameworks;
sourceTree = "<group>";
};
7A12A831117D9B4D152E0A51 /* Pods */ = {
isa = PBXGroup;
children = (
420D9BAB7B0D2AF9487DD060 /* Pods-SwiftExample.debug.xcconfig */,
2EB9C638FC2450A0B9786D1E /* Pods-SwiftExample.release.xcconfig */,
);
name = Pods;
sourceTree = "<group>";
};
BF01E9291C21FEF700BDE045 /* Inline Segmented */ = {
isa = PBXGroup;
children = (
@@ -349,6 +340,15 @@
name = "Inline Segmented";
sourceTree = "<group>";
};
E9F3DD7ACEF5AAF92FCE6E24 /* Pods */ = {
isa = PBXGroup;
children = (
F019783EE34BD17E2BA41467 /* Pods-SwiftExample.debug.xcconfig */,
CD0A6F89B9CD5843CA297E52 /* Pods-SwiftExample.release.xcconfig */,
);
name = Pods;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
@@ -356,12 +356,11 @@
isa = PBXNativeTarget;
buildConfigurationList = 2847A6BD1AAF2679000A2ABE /* Build configuration list for PBXNativeTarget "SwiftExample" */;
buildPhases = (
21FCE00817B1AE1029F382A4 /* 📦 Check Pods Manifest.lock */,
89E8536C00EFF5D0377E1AE9 /* [CP] Check Pods Manifest.lock */,
2847A69A1AAF2679000A2ABE /* Sources */,
2847A69B1AAF2679000A2ABE /* Frameworks */,
2847A69C1AAF2679000A2ABE /* Resources */,
A0F2DA95250A4C3E69515D96 /* 📦 Copy Pods Resources */,
DCA1F7B1D7E04613B3E151C1 /* 📦 Embed Pods Frameworks */,
DC50100813F1902A0CFCE009 /* [CP] Copy Pods Resources */,
);
buildRules = (
);
@@ -380,18 +379,18 @@
attributes = {
LastSwiftMigration = 0700;
LastSwiftUpdateCheck = 0700;
LastUpgradeCheck = 0800;
LastUpgradeCheck = 1200;
ORGANIZATIONNAME = Xmartlabs;
TargetAttributes = {
2847A69D1AAF2679000A2ABE = {
CreatedOnToolsVersion = 6.2;
LastSwiftMigration = 0800;
LastSwiftMigration = 1100;
};
};
};
buildConfigurationList = 2847A6991AAF2679000A2ABE /* Build configuration list for PBXProject "SwiftExample" */;
compatibilityVersion = "Xcode 3.2";
developmentRegion = English;
developmentRegion = en;
hasScannedForEncodings = 0;
knownRegions = (
en,
@@ -423,49 +422,40 @@
/* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
21FCE00817B1AE1029F382A4 /* 📦 Check Pods Manifest.lock */ = {
89E8536C00EFF5D0377E1AE9 /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
"${PODS_ROOT}/Manifest.lock",
);
name = "📦 Check Pods Manifest.lock";
name = "[CP] Check Pods Manifest.lock";
outputPaths = (
"$(DERIVED_FILE_DIR)/Pods-SwiftExample-checkManifestLockResult.txt",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n exit 1\nfi\n";
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
A0F2DA95250A4C3E69515D96 /* 📦 Copy Pods Resources */ = {
DC50100813F1902A0CFCE009 /* [CP] Copy Pods Resources */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
"${PODS_ROOT}/Target Support Files/Pods-SwiftExample/Pods-SwiftExample-resources.sh",
"${PODS_ROOT}/../../../XLForm/XLForm.bundle",
);
name = "📦 Copy Pods Resources";
name = "[CP] Copy Pods Resources";
outputPaths = (
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/XLForm.bundle",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-SwiftExample/Pods-SwiftExample-resources.sh\"\n";
showEnvVarsInLog = 0;
};
DCA1F7B1D7E04613B3E151C1 /* 📦 Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
);
name = "📦 Embed Pods Frameworks";
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-SwiftExample/Pods-SwiftExample-frameworks.sh\"\n";
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-SwiftExample/Pods-SwiftExample-resources.sh\"\n";
showEnvVarsInLog = 0;
};
/* End PBXShellScriptBuildPhase section */
@@ -512,18 +502,28 @@
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
@@ -546,7 +546,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 8.4;
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
@@ -559,18 +559,28 @@
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
@@ -586,7 +596,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 8.4;
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
@@ -597,7 +607,7 @@
};
2847A6BE1AAF2679000A2ABE /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 420D9BAB7B0D2AF9487DD060 /* Pods-SwiftExample.debug.xcconfig */;
baseConfigurationReference = F019783EE34BD17E2BA41467 /* Pods-SwiftExample.debug.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
@@ -606,13 +616,14 @@
PRODUCT_BUNDLE_IDENTIFIER = "com.xmartlabs.$(PRODUCT_NAME:rfc1034identifier)";
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "SwiftExample/SwiftExample-Bridging-Header.h";
SWIFT_VERSION = 3.0;
SWIFT_SWIFT3_OBJC_INFERENCE = Default;
SWIFT_VERSION = 5.0;
};
name = Debug;
};
2847A6BF1AAF2679000A2ABE /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 2EB9C638FC2450A0B9786D1E /* Pods-SwiftExample.release.xcconfig */;
baseConfigurationReference = CD0A6F89B9CD5843CA297E52 /* Pods-SwiftExample.release.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
@@ -621,7 +632,8 @@
PRODUCT_BUNDLE_IDENTIFIER = "com.xmartlabs.$(PRODUCT_NAME:rfc1034identifier)";
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "SwiftExample/SwiftExample-Bridging-Header.h";
SWIFT_VERSION = 3.0;
SWIFT_SWIFT3_OBJC_INFERENCE = Default;
SWIFT_VERSION = 5.0;
};
name = Release;
};
@@ -14,12 +14,12 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Declare custom rows
XLFormViewController.cellClassesForRowDescriptorTypes()[XLFormRowDescriptorTypeRate] = "XLFormRatingCell"
XLFormViewController.cellClassesForRowDescriptorTypes()[XLFormRowDescriptorTypeRate] = NSStringFromClass(XLFormRatingCell.self)
XLFormViewController.cellClassesForRowDescriptorTypes()[XLFormRowDescriptorTypeFloatLabeledTextField] = FloatLabeledTextFieldCell.self
XLFormViewController.cellClassesForRowDescriptorTypes()[XLFormRowDescriptorTypeWeekDays] = "XLFormWeekDaysCell"
XLFormViewController.cellClassesForRowDescriptorTypes()[XLFormRowDescriptorTypeWeekDays] = NSStringFromClass(XLFormWeekDaysCell.self)
XLFormViewController.cellClassesForRowDescriptorTypes()[XLFormRowDescriptorTypeSegmentedInline] = InlineSegmentedCell.self
XLFormViewController.cellClassesForRowDescriptorTypes()[XLFormRowDescriptorTypeSegmentedControl] = InlineSegmentedControl.self
XLFormViewController.inlineRowDescriptorTypesForRowDescriptorTypes()[XLFormRowDescriptorTypeSegmentedInline] = XLFormRowDescriptorTypeSegmentedControl
@@ -35,8 +35,8 @@ class FloatLabeledTextFieldCell : XLFormBaseCell, UITextFieldDelegate {
lazy var floatLabeledTextField: JVFloatLabeledTextField = {
let result = JVFloatLabeledTextField(frame: CGRect.zero)
result.translatesAutoresizingMaskIntoConstraints = false
result.font = UIFont.systemFont(ofSize: kFontSize)
result.floatingLabel.font = .boldSystemFont(ofSize: kFontSize)
result.font = UIFont.systemFont(ofSize: FloatLabeledTextFieldCell.kFontSize)
result.floatingLabel.font = .boldSystemFont(ofSize: FloatLabeledTextFieldCell.kFontSize)
result.clearButtonMode = .whileEditing
return result
}()
@@ -54,7 +54,7 @@ class FloatLabeledTextFieldCell : XLFormBaseCell, UITextFieldDelegate {
override func update() {
super.update()
if let rowDescriptor = rowDescriptor {
floatLabeledTextField.attributedPlaceholder = NSAttributedString(string: rowDescriptor.title ?? "" , attributes: [NSForegroundColorAttributeName: UIColor.lightGray])
floatLabeledTextField.attributedPlaceholder = NSAttributedString(string: rowDescriptor.title ?? "" , attributes: [NSAttributedString.Key.foregroundColor: UIColor.lightGray])
if let value = rowDescriptor.value {
floatLabeledTextField.text = (value as AnyObject).displayText()
}
@@ -57,7 +57,7 @@ class InlineSegmentedCell : XLFormBaseCell {
override func formDescriptorCellBecomeFirstResponder() -> Bool {
if isFirstResponder {
resignFirstResponder()
_ = resignFirstResponder()
return false
}
return becomeFirstResponder()
@@ -88,7 +88,7 @@ class InlineSegmentedControl : XLFormBaseCell, XLFormInlineRowDescriptorCell {
var inlineRowDescriptor : XLFormRowDescriptor?
lazy var segmentedControl : UISegmentedControl = {
return UISegmentedControl.autolayoutView() as! UISegmentedControl
return UISegmentedControl.autolayout()!
}()
override func configure() {
@@ -108,7 +108,7 @@ class InlineSegmentedControl : XLFormBaseCell, XLFormInlineRowDescriptorCell {
//MARK: Actions
func valueChanged() {
@objc func valueChanged() {
inlineRowDescriptor!.value = inlineRowDescriptor!.selectorOptions![segmentedControl.selectedSegmentIndex]
formViewController().updateFormRow(inlineRowDescriptor)
}
@@ -118,7 +118,7 @@ class InlineSegmentedControl : XLFormBaseCell, XLFormInlineRowDescriptorCell {
func getItems() -> NSMutableArray {
let result = NSMutableArray()
for option in inlineRowDescriptor!.selectorOptions! {
result.add((option as AnyObject).displayText())
result.add((option as AnyObject).displayText() ?? "")
}
return result
}
@@ -135,7 +135,7 @@ class InlineSegmentedControl : XLFormBaseCell, XLFormInlineRowDescriptorCell {
if let value = formRow?.value as? NSObject {
for option in (formRow?.selectorOptions)! {
if ((option as! NSObject).valueData() as AnyObject) === (value.valueData() as AnyObject) {
return formRow?.selectorOptions?.index(where: { ($0 as! NSObject) == (option as! NSObject) } ) ?? -1
return formRow?.selectorOptions?.firstIndex(where: { ($0 as! NSObject) == (option as! NSObject) } ) ?? -1
}
}
}
@@ -49,7 +49,7 @@ class XLFormRatingCell : XLFormBaseCell {
//MARK: Events
func rateChanged(_ ratingView : XLRatingView){
@objc func rateChanged(_ ratingView : XLRatingView){
rowDescriptor!.value = ratingView.value
}
@@ -110,7 +110,7 @@ class XLFormWeekDaysCell : XLFormBaseCell {
func configureButtons() {
for subview in contentView.subviews {
if let button = subview as? UIButton {
button.setImage(UIImage(named: "uncheckedDay"), for: UIControlState())
button.setImage(UIImage(named: "uncheckedDay"), for: UIControl.State())
button.setImage(UIImage(named: "checkedDay"), for: .selected)
button.adjustsImageWhenHighlighted = false
imageTopTitleBottom(button)
@@ -120,7 +120,7 @@ class XLFormWeekDaysCell : XLFormBaseCell {
}
func updateButtons() {
var value = rowDescriptor!.value as! Dictionary<String, Bool>
let value = rowDescriptor!.value as! Dictionary<String, Bool>
sundayButton.isSelected = value[kWeekDay.sunday.description()]!
mondayButton.isSelected = value[kWeekDay.monday.description()]!
@@ -150,8 +150,8 @@ class XLFormWeekDaysCell : XLFormBaseCell {
// raise the image and push it right so it appears centered
// above the text
let titleSize : CGSize = (button.titleLabel!.text! as NSString).size(attributes: [NSFontAttributeName: button.titleLabel!.font])
button.imageEdgeInsets = UIEdgeInsetsMake(-(titleSize.height + spacing), 0.0, 0.0, -titleSize.width)
let titleSize : CGSize = (button.titleLabel!.text! as NSString).size(withAttributes: [NSAttributedString.Key.font: button.titleLabel!.font as Any])
button.imageEdgeInsets = UIEdgeInsets.init(top: -(titleSize.height + spacing), left: 0.0, bottom: 0.0, right: -titleSize.width)
}
func getDayFormButton(_ button: UIButton) -> String {
@@ -42,7 +42,7 @@ class MapViewController : UIViewController, XLFormRowDescriptorViewController, M
var rowDescriptor: XLFormRowDescriptor?
lazy var mapView : MKMapView = { [unowned self] in
let mapView = MKMapView(frame: self.view.frame)
mapView.autoresizingMask = [UIViewAutoresizing.flexibleHeight, UIViewAutoresizing.flexibleWidth]
mapView.autoresizingMask = [UIView.AutoresizingMask.flexibleHeight, UIView.AutoresizingMask.flexibleWidth]
return mapView
}()
@@ -73,14 +73,14 @@ class MapViewController : UIViewController, XLFormRowDescriptorViewController, M
func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
let pinAnnotationView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: "annotation")
pinAnnotationView.pinColor = MKPinAnnotationColor.red
pinAnnotationView.pinTintColor = .red
pinAnnotationView.isDraggable = true
pinAnnotationView.animatesDrop = true
return pinAnnotationView
}
func mapView(_ mapView: MKMapView, annotationView view: MKAnnotationView, didChange newState: MKAnnotationViewDragState, fromOldState oldState: MKAnnotationViewDragState) {
func mapView(_ mapView: MKMapView, annotationView view: MKAnnotationView, didChange newState: MKAnnotationView.DragState, fromOldState oldState: MKAnnotationView.DragState) {
if (newState == .ending){
if let rowDescriptor = rowDescriptor, let annotation = view.annotation {
rowDescriptor.value = CLLocation(latitude:annotation.coordinate.latitude, longitude:annotation.coordinate.longitude)
@@ -56,7 +56,7 @@ class DatesFormViewController: XLFormViewController {
}
func disableEnable(_ button : UIBarButtonItem){
@objc func disableEnable(_ button : UIBarButtonItem){
form.isDisabled = !form.isDisabled
button.title = form.isDisabled ? "Enable" : "Disable"
tableView.endEditing(true)
@@ -141,7 +141,7 @@ class DatesFormViewController: XLFormViewController {
// DatePicker
row = XLFormRowDescriptor(tag: Tags.DatePicker, rowType:XLFormRowDescriptorTypeDatePicker)
row.cellConfigAtConfigure["datePicker.datePickerMode"] = UIDatePickerMode.date.rawValue
row.cellConfigAtConfigure["datePicker.datePickerMode"] = UIDatePicker.Mode.date.rawValue
row.value = Date()
section.addFormRow(row)
@@ -154,8 +154,10 @@ class DatesFormViewController: XLFormViewController {
override func formRowDescriptorValueHasChanged(_ formRow: XLFormRowDescriptor!, oldValue: Any!, newValue: Any!) {
super.formRowDescriptorValueHasChanged(formRow, oldValue: oldValue, newValue: newValue)
if formRow.tag == Tags.DatePicker {
let alertView = UIAlertView(title: "DatePicker", message: "Value Has changed!", delegate: self, cancelButtonTitle: "OK")
alertView.show()
let alert = UIAlertController(title: "DatePicker", message: "Values has changed!", preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
present(alert, animated: true, completion: nil)
}
}
@@ -42,7 +42,7 @@ class UserCell : UITableViewCell {
return tempUserName
}()
override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
// Initialization code
@@ -67,7 +67,7 @@ class UserCell : UITableViewCell {
let metrics = [ "imgSize": 50.0, "margin": 12.0]
var result = NSLayoutConstraint.constraints(withVisualFormat: "H:|-(margin)-[image(imgSize)]-[name]", options:.alignAllTop, metrics: metrics, views: views)
result += NSLayoutConstraint.constraints(withVisualFormat: "V:|-(margin)-[image(imgSize)]", options:NSLayoutFormatOptions(), metrics:metrics, views: views)
result += NSLayoutConstraint.constraints(withVisualFormat: "V:|-(margin)-[image(imgSize)]", options:NSLayoutConstraint.FormatOptions(), metrics:metrics, views: views)
return result
}
@@ -131,18 +131,14 @@ class User: NSObject, XLFormOptionObject {
}
class UsersTableViewController : UITableViewController, XLFormRowDescriptorViewController, XLFormRowDescriptorPopoverViewController {
class UsersTableViewController : UITableViewController, XLFormRowDescriptorViewController {
var rowDescriptor : XLFormRowDescriptor?
var popoverController : UIPopoverController?
var userCell : UserCell?
fileprivate let kUserCellIdentifier = "UserCell"
override init(style: UITableViewStyle) {
override init(style: UITableView.Style) {
super.init(style: style);
}
@@ -197,9 +193,9 @@ class UsersTableViewController : UITableViewController, XLFormRowDescriptorViewC
let userData = usersData[(indexPath as NSIndexPath).row] as Dictionary<String, AnyObject>
let user = User(userId: (userData["id"] as! Int), userName: userData["name"] as! String, userImage: userData["imageName"] as! String)
self.rowDescriptor!.value = user;
if let porpOver = self.popoverController {
porpOver.dismiss(animated: true)
porpOver.delegate?.popoverControllerDidDismissPopover!(porpOver)
if let popOver = self.presentedViewController, popOver.modalPresentationStyle == .popover {
dismiss(animated: true, completion: nil)
}
else if parent is UINavigationController {
navigationController?.popViewController(animated: true)
@@ -137,7 +137,7 @@ class InputsFormViewController : XLFormViewController {
navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .save, target: self, action: #selector(InputsFormViewController.savePressed(_:)))
}
func savePressed(_ button: UIBarButtonItem)
@objc func savePressed(_ button: UIBarButtonItem)
{
let validationErrors : Array<NSError> = self.formValidationErrors() as! Array<NSError>
if (validationErrors.count > 0){
@@ -145,8 +145,11 @@ class InputsFormViewController : XLFormViewController {
return
}
self.tableView.endEditing(true)
let alertView = UIAlertView(title: "Valid Form", message: "No errors found", delegate: self, cancelButtonTitle: "OK")
alertView.show()
let alert = UIAlertController(title: "Valid Form", message: "No errors found!", preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
present(alert, animated: true, completion: nil)
}
}
@@ -83,42 +83,45 @@ class MultivaluedFormViewController : XLFormViewController {
//MARK: - Actions
func addDidTouch(_ sender: UIBarButtonItem) {
let actionSheet = UIActionSheet(title: nil, delegate: self, cancelButtonTitle: "Cancel", destructiveButtonTitle: "Remove Last Section", otherButtonTitles: "Add a section at the end", self.form!.isDisabled ? "Enable Form" : "Disable Form")
actionSheet.show(in: view)
}
//MARK: - UIActionSheetDelegate
override func actionSheet(_ actionSheet: UIActionSheet, clickedButtonAt buttonIndex: Int) {
if actionSheet.destructiveButtonIndex == buttonIndex {
if form.formSections.count > 0 {
@objc func addDidTouch(_ sender: UIBarButtonItem) {
let actionSheet = UIAlertController(title: nil, message: nil, preferredStyle: .actionSheet)
let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: nil)
let removeAction = UIAlertAction(title: "Remove Last Section", style: .destructive, handler: { [weak self] alert in
guard let `self` = self else { return }
if self.form.formSections.count > 0 {
// remove last section
form.removeFormSection(at: UInt(form.formSections.count - 1))
self.form.removeFormSection(at: UInt(self.form.formSections.count - 1))
}
}
else if actionSheet.buttonTitle(at: buttonIndex) == "Add a section at the end" {
// add a new section
// let dateString = NSDateFormatter.localizedStringFromDate(NSDate(), dateStyle: NSDateFormatterStyle.ShortStyle, timeStyle: NSDateFormatterStyle.ShortStyle)
})
let addSectionAction = UIAlertAction(title: "Add a section at the end", style: .default, handler: { [weak self] alert in
guard let `self` = self else { return }
let newSection = XLFormSectionDescriptor.formSection(withTitle: "Section created at \(DateFormatter.localizedString(from: Date(), dateStyle: DateFormatter.Style.short, timeStyle: DateFormatter.Style.short))", sectionOptions:XLFormSectionOptions.canInsert.union(.canDelete))
newSection.multivaluedTag = "multivaluedPushSelector_\(self.form.formSections.count)"
let newRow = XLFormRowDescriptor(tag: nil, rowType: XLFormRowDescriptorTypeSelectorPush, title: "Tap to select )..")
newRow.selectorOptions = ["Option 1", "Option 2", "Option 3"]
newSection.addFormRow(newRow)
form.addFormSection(newSection)
}
else {
form.isDisabled = !self.form.isDisabled
tableView.endEditing(true)
tableView.reloadData()
}
self.form.addFormSection(newSection)
})
let toggleAction = UIAlertAction(title: self.form!.isDisabled ? "Enable Form" : "Disable Form", style: .default, handler: { [weak self] alert in
guard let `self` = self else { return }
self.form.isDisabled = !self.form.isDisabled
self.tableView.endEditing(true)
self.tableView.reloadData()
})
actionSheet.addAction(addSectionAction)
actionSheet.addAction(removeAction)
actionSheet.addAction(cancelAction)
actionSheet.addAction(toggleAction)
present(actionSheet, animated: true, completion: nil)
}
}
class MultivaluedOnlyReorderViewController : XLFormViewController {
required init?(coder aDecoder: NSCoder) {
@@ -245,7 +248,7 @@ class MultivaluedOnlyDeleteViewController : XLFormViewController {
navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Editing", style: .plain, target: self, action: #selector(MultivaluedOnlyDeleteViewController.toggleEditing(_:)))
}
func toggleEditing(_ sender : UIBarButtonItem) {
@objc func toggleEditing(_ sender : UIBarButtonItem) {
tableView.setEditing(!tableView.isEditing, animated: true)
sender.title = tableView.isEditing ? "Editing" : "Not Editing"
}
@@ -27,7 +27,7 @@ let XLFormRowDescriptorTypeCustom = "XLFormRowDescriptorTypeCustom"
class XLFormCustomCell : XLFormBaseCell {
override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
}
@@ -122,12 +122,14 @@ class OthersFormViewController : XLFormViewController {
row = XLFormRowDescriptor(tag: Tags.ButtonLeftAligned, rowType: XLFormRowDescriptorTypeButton, title: "Button with Block")
row.cellConfig["textLabel.textColor"] = UIColor(red: 0.0, green: 122.0/255.0, blue: 1.0, alpha: 1.0)
row.cellConfig["textLabel.textAlignment"] = NSTextAlignment.left.rawValue
row.cellConfig["accessoryType"] = UITableViewCellAccessoryType.disclosureIndicator.rawValue
row.cellConfig["accessoryType"] = UITableViewCell.AccessoryType.disclosureIndicator.rawValue
row.action.formBlock = { [weak self] (sender: XLFormRowDescriptor!) -> Void in
let switchRow = sender.sectionDescriptor.formDescriptor!.formRow(withTag: Tags.SwitchBool)!
if let value = switchRow.value , (value as AnyObject).boolValue == true {
let alertView = UIAlertView(title: "Switch is ON", message: "Button has checked the switch value...", delegate: self, cancelButtonTitle: "OK")
alertView.show()
let alert = UIAlertController(title: "Switch is ON", message: "Button has checked the switch value...", preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
self?.present(alert, animated: true, completion: nil)
}
self?.deselectFormRow(sender)
}
@@ -164,10 +166,12 @@ class OthersFormViewController : XLFormViewController {
self.form = form
}
func didTouchButton(_ sender: XLFormRowDescriptor) {
@objc func didTouchButton(_ sender: XLFormRowDescriptor) {
if (sender.sectionDescriptor.formDescriptor.formRow(withTag: Tags.SwitchBool)?.value as AnyObject).boolValue == true{
let alertView = UIAlertView(title: "Switch is ON", message: "Button has checked the switch value...", delegate: self, cancelButtonTitle: "OK")
alertView.show()
let alert = UIAlertController(title: "Switch is ON", message: "Button has checked the switch value...", preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
present(alert, animated: true, completion: nil)
}
self.deselectFormRow(sender)
}
@@ -183,7 +187,7 @@ class OthersFormViewController : XLFormViewController {
}
func disableEnable(_ button : UIBarButtonItem) {
@objc func disableEnable(_ button : UIBarButtonItem) {
form.isDisabled = !form.isDisabled
button.title = form.isDisabled ? "Enable" : "Disable"
tableView.endEditing(true)
@@ -82,12 +82,12 @@ class NativeEventFormViewController : XLFormViewController {
row = XLFormRowDescriptor(tag: "repeat", rowType:XLFormRowDescriptorTypeSelectorPush, title:"Repeat")
row.value = XLFormOptionsObject(value: 0, displayText: "Never")
row.selectorTitle = "Repeat"
row.selectorOptions = [XLFormOptionsObject(value: 0, displayText: "Never"),
XLFormOptionsObject(value: 1, displayText: "Every Day"),
XLFormOptionsObject(value: 2, displayText: "Every Week"),
XLFormOptionsObject(value: 3, displayText: "Every 2 Weeks"),
XLFormOptionsObject(value: 4, displayText: "Every Month"),
XLFormOptionsObject(value: 5, displayText: "Every Year")]
row.selectorOptions = [XLFormOptionsObject(value: 0, displayText: "Never")!,
XLFormOptionsObject(value: 1, displayText: "Every Day")!,
XLFormOptionsObject(value: 2, displayText: "Every Week")!,
XLFormOptionsObject(value: 3, displayText: "Every 2 Weeks")!,
XLFormOptionsObject(value: 4, displayText: "Every Month")!,
XLFormOptionsObject(value: 5, displayText: "Every Year")!]
section.addFormRow(row)
section = XLFormSectionDescriptor.formSection()
@@ -98,15 +98,15 @@ class NativeEventFormViewController : XLFormViewController {
row.value = XLFormOptionsObject(value: 0, displayText: "None")
row.selectorTitle = "Event Alert"
row.selectorOptions = [
XLFormOptionsObject(value: 0, displayText: "None"),
XLFormOptionsObject(value: 1, displayText: "At time of event"),
XLFormOptionsObject(value: 2, displayText: "5 minutes before"),
XLFormOptionsObject(value: 3, displayText: "15 minutes before"),
XLFormOptionsObject(value: 4, displayText: "30 minutes before"),
XLFormOptionsObject(value: 5, displayText: "1 hour before"),
XLFormOptionsObject(value: 6, displayText: "2 hours before"),
XLFormOptionsObject(value: 7, displayText: "1 day before"),
XLFormOptionsObject(value: 8, displayText: "2 days before")]
XLFormOptionsObject(value: 0, displayText: "None")!,
XLFormOptionsObject(value: 1, displayText: "At time of event")!,
XLFormOptionsObject(value: 2, displayText: "5 minutes before")!,
XLFormOptionsObject(value: 3, displayText: "15 minutes before")!,
XLFormOptionsObject(value: 4, displayText: "30 minutes before")!,
XLFormOptionsObject(value: 5, displayText: "1 hour before")!,
XLFormOptionsObject(value: 6, displayText: "2 hours before")!,
XLFormOptionsObject(value: 7, displayText: "1 day before")!,
XLFormOptionsObject(value: 8, displayText: "2 days before")!]
section.addFormRow(row)
@@ -117,8 +117,8 @@ class NativeEventFormViewController : XLFormViewController {
row = XLFormRowDescriptor(tag: "showAs", rowType:XLFormRowDescriptorTypeSelectorPush, title:"Show As")
row.value = XLFormOptionsObject(value: 0, displayText: "Busy")
row.selectorTitle = "Show As"
row.selectorOptions = [XLFormOptionsObject(value: 0, displayText:"Busy"),
XLFormOptionsObject(value: 1, displayText:"Free")]
row.selectorOptions = [XLFormOptionsObject(value: 0, displayText:"Busy")!,
XLFormOptionsObject(value: 1, displayText:"Free")!]
section.addFormRow(row)
section = XLFormSectionDescriptor.formSection()
@@ -197,7 +197,7 @@ class NativeEventFormViewController : XLFormViewController {
// startDateDescriptor is later than endDateDescriptor
dateEndCell.update()
let newDetailText = dateEndCell.detailTextLabel!.text!
let strikeThroughAttribute = [NSStrikethroughStyleAttributeName : NSUnderlineStyle.styleSingle.rawValue]
let strikeThroughAttribute = [NSAttributedString.Key.strikethroughStyle : NSUnderlineStyle.single.rawValue]
let strikeThroughText = NSAttributedString(string: newDetailText, attributes: strikeThroughAttribute)
endDateDescriptor.cellConfig["detailTextLabel.attributedText"] = strikeThroughText
updateFormRow(endDateDescriptor)
@@ -210,12 +210,12 @@ class NativeEventFormViewController : XLFormViewController {
}
}
func cancelPressed(_ button: UIBarButtonItem){
@objc func cancelPressed(_ button: UIBarButtonItem){
dismiss(animated: true, completion: nil)
}
func savePressed(_ button: UIBarButtonItem){
@objc func savePressed(_ button: UIBarButtonItem){
let validationErrors : Array<NSError> = formValidationErrors() as! Array<NSError>
if (validationErrors.count > 0){
showFormValidationError(validationErrors.first)
@@ -107,7 +107,7 @@ class SelectorsFormViewController : XLFormViewController {
navigationItem.rightBarButtonItem = barButton
}
func disableEnable(_ button : UIBarButtonItem)
@objc func disableEnable(_ button : UIBarButtonItem)
{
form.isDisabled = !form.isDisabled
button.title = form.isDisabled ? "Enable" : "Disable"
@@ -129,11 +129,11 @@ class SelectorsFormViewController : XLFormViewController {
// Selector Push
row = XLFormRowDescriptor(tag: Tags.Push, rowType:XLFormRowDescriptorTypeSelectorPush, title:"Push")
row.selectorOptions = [XLFormOptionsObject(value: 0, displayText: "Option 1"),
XLFormOptionsObject(value: 1, displayText:"Option 2"),
XLFormOptionsObject(value: 2, displayText:"Option 3"),
XLFormOptionsObject(value: 3, displayText:"Option 4"),
XLFormOptionsObject(value: 4, displayText:"Option 5")
row.selectorOptions = [XLFormOptionsObject(value: 0, displayText: "Option 1")!,
XLFormOptionsObject(value: 1, displayText:"Option 2")!,
XLFormOptionsObject(value: 2, displayText:"Option 3")!,
XLFormOptionsObject(value: 3, displayText:"Option 4")!,
XLFormOptionsObject(value: 4, displayText:"Option 5")!
]
row.value = XLFormOptionsObject(value: 1, displayText:"Option 2")
section.addFormRow(row)
@@ -1,8 +1,10 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="9531" systemVersion="14F1021" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" initialViewController="p4n-1v-pzo">
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="14865.1" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" colorMatched="YES" initialViewController="p4n-1v-pzo">
<device id="retina6_1" orientation="portrait" appearance="light"/>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="9529"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14819.2"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
<!--Navigation Controller-->
@@ -11,7 +13,7 @@
<navigationController automaticallyAdjustsScrollViewInsets="NO" id="p4n-1v-pzo" sceneMemberID="viewController">
<toolbarItems/>
<navigationBar key="navigationBar" contentMode="scaleToFill" id="SNt-hk-N3V">
<rect key="frame" x="0.0" y="0.0" width="320" height="44"/>
<rect key="frame" x="0.0" y="44" width="414" height="44"/>
<autoresizingMask key="autoresizingMask"/>
</navigationBar>
<nil name="viewControllers"/>
@@ -21,7 +23,7 @@
</navigationController>
<placeholder placeholderIdentifier="IBFirstResponder" id="jqF-cF-u4f" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="117" y="56"/>
<point key="canvasLocation" x="-107" y="43"/>
</scene>
<!--Others Form View Controller-->
<scene sceneID="dyJ-7m-RaD">
@@ -32,9 +34,9 @@
<viewControllerLayoutGuide type="bottom" id="HPb-Nx-E1G"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="wpr-wE-9nj">
<rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</view>
<navigationItem key="navigationItem" id="Hf0-cB-ORN"/>
<connections>
@@ -43,7 +45,7 @@
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="7YZ-ZR-X81" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="1533" y="-233"/>
<point key="canvasLocation" x="2221.739130434783" y="-156.02678571428569"/>
</scene>
<!--Native Event Form View Controller-->
<scene sceneID="EjT-rm-U3h">
@@ -54,15 +56,15 @@
<viewControllerLayoutGuide type="bottom" id="QuR-kY-o5R"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="tun-QW-CGC">
<rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
<rect key="frame" x="0.0" y="0.0" width="414" height="842"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="grouped" separatorStyle="default" rowHeight="44" sectionHeaderHeight="10" sectionFooterHeight="10" translatesAutoresizingMaskIntoConstraints="NO" id="JY7-WL-SnH">
<rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
<color key="backgroundColor" red="0.93725490196078431" green="0.93725490196078431" blue="0.95686274509803926" alpha="1" colorSpace="calibratedRGB"/>
<rect key="frame" x="0.0" y="0.0" width="414" height="808"/>
<color key="backgroundColor" red="0.93725490196078431" green="0.93725490196078431" blue="0.95686274509803926" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</tableView>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<constraints>
<constraint firstItem="JY7-WL-SnH" firstAttribute="leading" secondItem="tun-QW-CGC" secondAttribute="leading" id="bSe-SV-rx6"/>
<constraint firstAttribute="trailing" secondItem="JY7-WL-SnH" secondAttribute="trailing" id="jLI-68-pSq"/>
@@ -77,7 +79,7 @@
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="zV0-mq-irv" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="1120" y="-635"/>
<point key="canvasLocation" x="1623.1884057971015" y="-425.22321428571428"/>
</scene>
<!--Examples-->
<scene sceneID="wf7-ha-lXx">
@@ -88,20 +90,20 @@
<viewControllerLayoutGuide type="bottom" id="0bE-2H-tqE"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="PO9-pF-A7O">
<rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="grouped" separatorStyle="default" rowHeight="44" sectionHeaderHeight="10" sectionFooterHeight="10" translatesAutoresizingMaskIntoConstraints="NO" id="Lxj-Sb-kC6">
<rect key="frame" x="0.0" y="64" width="320" height="504"/>
<color key="backgroundColor" red="0.93725490196078431" green="0.93725490196078431" blue="0.95686274509803926" alpha="1" colorSpace="calibratedRGB"/>
<rect key="frame" x="0.0" y="88" width="414" height="774"/>
<color key="backgroundColor" red="0.93725490196078431" green="0.93725490196078431" blue="0.95686274509803926" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</tableView>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<constraints>
<constraint firstItem="Lxj-Sb-kC6" firstAttribute="top" secondItem="kOR-67-djF" secondAttribute="bottom" id="PT1-Xo-3Ql"/>
<constraint firstItem="Lxj-Sb-kC6" firstAttribute="top" secondItem="kOR-67-djF" secondAttribute="bottom" id="R5O-as-LEG"/>
<constraint firstAttribute="trailing" secondItem="Lxj-Sb-kC6" secondAttribute="trailing" id="brq-yF-WM8"/>
<constraint firstItem="Lxj-Sb-kC6" firstAttribute="leading" secondItem="PO9-pF-A7O" secondAttribute="leading" id="d73-kq-kX4"/>
<constraint firstItem="0bE-2H-tqE" firstAttribute="top" secondItem="Lxj-Sb-kC6" secondAttribute="bottom" id="ltM-g9-Dgm"/>
<constraint firstItem="0bE-2H-tqE" firstAttribute="top" secondItem="Lxj-Sb-kC6" secondAttribute="bottom" id="dMl-nD-Jm5"/>
</constraints>
</view>
<navigationItem key="navigationItem" title="Examples" id="sEr-D1-cU5"/>
@@ -118,7 +120,7 @@
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="1V5-DZ-WfF" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="527" y="56"/>
<point key="canvasLocation" x="763.768115942029" y="37.5"/>
</scene>
<!--Blog Example View Controller-->
<scene sceneID="Vn0-9y-5bc">
@@ -129,15 +131,15 @@
<viewControllerLayoutGuide type="bottom" id="scM-da-Sg0"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="hrV-fb-58s">
<rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</view>
<navigationItem key="navigationItem" id="RJB-cz-SnF"/>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="Fvo-wr-5Ca" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="167" y="1151"/>
<point key="canvasLocation" x="242.0289855072464" y="770.75892857142856"/>
</scene>
<!--Validation Examples-->
<scene sceneID="z2I-Nk-y9W">
@@ -148,15 +150,15 @@
<viewControllerLayoutGuide type="bottom" id="xtJ-Wo-mhU"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="1Ol-Ra-Ysg">
<rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="grouped" separatorStyle="default" rowHeight="44" sectionHeaderHeight="10" sectionFooterHeight="10" translatesAutoresizingMaskIntoConstraints="NO" id="Fty-3j-BeF">
<rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
<color key="backgroundColor" red="0.93725490196078431" green="0.93725490196078431" blue="0.95686274509803926" alpha="1" colorSpace="calibratedRGB"/>
<rect key="frame" x="0.0" y="24" width="414" height="838"/>
<color key="backgroundColor" red="0.93725490196078431" green="0.93725490196078431" blue="0.95686274509803926" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</tableView>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<constraints>
<constraint firstItem="xtJ-Wo-mhU" firstAttribute="top" secondItem="Fty-3j-BeF" secondAttribute="bottom" id="CbV-4f-RzP"/>
<constraint firstItem="Fty-3j-BeF" firstAttribute="top" secondItem="AG9-N9-2qp" secondAttribute="bottom" constant="-64" id="Pdw-VG-qcc"/>
@@ -173,7 +175,7 @@
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="VFT-Og-STO" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="566" y="938"/>
<point key="canvasLocation" x="820.28985507246387" y="628.125"/>
</scene>
<!--Predicate Form View Controller-->
<scene sceneID="a9p-C8-g8y">
@@ -184,15 +186,15 @@
<viewControllerLayoutGuide type="bottom" id="Lsg-dH-McH"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="6EZ-O7-FjX">
<rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</view>
<navigationItem key="navigationItem" id="Lsd-xH-7IN"/>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="rZL-10-YZn" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="956" y="924"/>
<point key="canvasLocation" x="1385.5072463768117" y="618.75"/>
</scene>
<!--Selectors Form View Controller-->
<scene sceneID="KYK-TX-8rm">
@@ -203,9 +205,9 @@
<viewControllerLayoutGuide type="bottom" id="CTu-Y5-7Qw"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="bNj-SD-83w">
<rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</view>
<navigationItem key="navigationItem" id="Buo-Af-6Q1"/>
<connections>
@@ -214,7 +216,7 @@
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="8fu-YK-6qz" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="1346" y="533"/>
<point key="canvasLocation" x="1950.7246376811595" y="356.91964285714283"/>
</scene>
<!--Map View Controller-->
<scene sceneID="tAS-lK-35t">
@@ -225,15 +227,15 @@
<viewControllerLayoutGuide type="bottom" id="cgQ-Vs-ICN"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="JjC-E5-SyY">
<rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</view>
<navigationItem key="navigationItem" id="BjG-Bq-0lD"/>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="LmS-YR-mFY" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="1789" y="533"/>
<point key="canvasLocation" x="2592.753623188406" y="356.91964285714283"/>
</scene>
<!--Native Event Navigation View Controller-->
<scene sceneID="mNb-be-ApA">
@@ -241,7 +243,7 @@
<navigationController automaticallyAdjustsScrollViewInsets="NO" id="K9D-4c-9eZ" customClass="NativeEventNavigationViewController" customModule="SwiftExample" customModuleProvider="target" sceneMemberID="viewController">
<toolbarItems/>
<navigationBar key="navigationBar" contentMode="scaleToFill" id="fO3-V7-XXu">
<rect key="frame" x="0.0" y="0.0" width="320" height="44"/>
<rect key="frame" x="0.0" y="0.0" width="414" height="56"/>
<autoresizingMask key="autoresizingMask"/>
</navigationBar>
<nil name="viewControllers"/>
@@ -251,7 +253,7 @@
</navigationController>
<placeholder placeholderIdentifier="IBFirstResponder" id="eqB-vl-BzH" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="588" y="-635"/>
<point key="canvasLocation" x="852.17391304347836" y="-425.22321428571428"/>
</scene>
<!--Basic Predicate View Controller-->
<scene sceneID="pD4-sm-x3a">
@@ -262,15 +264,15 @@
<viewControllerLayoutGuide type="bottom" id="2b4-gN-85p"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="NZg-t1-g19">
<rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</view>
<navigationItem key="navigationItem" id="1lh-jZ-lIV"/>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="Tlw-q2-pcu" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="-159" y="1151"/>
<point key="canvasLocation" x="-230.43478260869566" y="770.75892857142856"/>
</scene>
</scenes>
<inferredMetricsTieBreakers>
@@ -118,7 +118,7 @@ class ValidationExamplesFormViewController : XLFormViewController {
//MARK: Actions
func validateForm(_ buttonItem: UIBarButtonItem) {
@objc func validateForm(_ buttonItem: UIBarButtonItem) {
let array = formValidationErrors()
for errorItem in array! {
let error = errorItem as! NSError
@@ -150,7 +150,7 @@ class ValidationExamplesFormViewController : XLFormViewController {
animation.values = [0, 20, -20, 10, 0]
animation.keyTimes = [0, NSNumber(value: 1 / 6.0), NSNumber(value: 3 / 6.0), NSNumber(value: 5 / 6.0), 1]
animation.duration = 0.3
animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseOut)
animation.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.easeOut)
animation.isAdditive = true
cell.layer.add(animation, forKey: "shake")
}
+21
View File
@@ -0,0 +1,21 @@
// swift-tools-version:5.2
import PackageDescription
let package = Package(
name: "XLForm",
platforms: [
.iOS(.v9)
],
products: [
.library(name: "XLForm", targets: ["XLForm"])
],
dependencies: [],
targets: [
.target(
name: "XLForm",
dependencies: [],
path: "XLForm",
publicHeadersPath: "XL"
)
]
)
+36 -12
View File
@@ -6,7 +6,9 @@ By [XMARTLABS](http://xmartlabs.com).
[![Build Status](https://travis-ci.org/xmartlabs/XLForm.svg?branch=master)](https://travis-ci.org/xmartlabs/XLForm)
<a href="https://cocoapods.org/pods/XLForm"><img src="https://img.shields.io/cocoapods/v/XLForm.svg" alt="CocoaPods compatible" /></a>
**If you are working in Swift then you should have a look at [Eureka], a complete re-design of XLForm in Swift.** *Do not panic, we will continue maintaining and improving XLForm, obj-c rocks!!*
**If you are working in Swift then you should have a look at [Eureka], a complete re-design of XLForm in Swift and with more features.**
We are not implementing any new features for XLForm anymore. However, if a critical issue arises we will fix it.
Purpose
--------------
@@ -154,7 +156,7 @@ A form definition is a `XLFormDescriptor` instance that contains one or more sec
row = [XLFormRowDescriptor formRowDescriptorWithTag:@"starts" rowType:XLFormRowDescriptorTypeDateTimeInline title:@"Starts"];
row.value = [NSDate dateWithTimeIntervalSinceNow:60*60*24];
[section addFormRow:row];
self.form = form;
}
```
@@ -492,7 +494,7 @@ Set `steps` to `@(0)` to disable the steps functionality.
##### Info
Sometimes our apps needs to show data that are not editable. XLForm provides us with `XLFormRowDescriptorTypeInfo` row type to display not editable info. An example of usage would be showing the app version in the settings part of an app.
Sometimes our apps needs to show data that are not editable. XLForm provides us with `XLFormRowDescriptorTypeInfo` row type to display not editable info. An example of usage would be showing the app version in the settings part of an app.
##### Button
@@ -502,7 +504,7 @@ Apart from data entry rows, not editable rows and selectors, XLForm has a button
Multivalued Sections (Insert, Delete, Reorder rows)
------------------------
Any `XLFormSectionDescriptor` object can be set up to support row insertion, deletion or reodering. It is possible to enable only one of these modes, a combination or all together.
Any `XLFormSectionDescriptor` object can be set up to support row insertion, deletion or reodering. It is possible to enable only one of these modes, a combination or all together.
A multivalued section is just a section that support either of these modes.
The most interesting part of multivalued `XLFormSectionDescriptor` is that it supports all the types of rows that were shown on the [*Rows*](#rows "Rows") section as well as custom rows.
@@ -666,7 +668,7 @@ row.action.viewControllerClass = [MapViewController class];
// or
//row.action.viewControllerNibName = @"MapViewControllerNibName";
// Set up a NSValueTransformer to convert CLLocation to NSString, it's used to show the select value description (text).
// Set up a NSValueTransformer to convert CLLocation to NSString, it's used to show the select value description (text).
row.valueTransformer = [CLLocationValueTrasformer class];
// Set up the default value
row.value = [[CLLocation alloc] initWithLatitude:-33 longitude:-56];
@@ -690,7 +692,7 @@ XLForm sets up `rowDescriptor` property using the `XLFormRowDescriptor` instance
The developer is responsible for update its views with the `rowDescriptor` value as well as set the selected value to `rowDescriptor` from within the custom selector view controller.
> Note: the properties `viewControllerClass`, `viewControllerNibName` or `viewControllerStoryboardId` are mutually exclusive and are used by `XLFormButtonCell` and `XLFormSelectorCell`. If you create a custom cell then you are responsible for using them.
> Note: the properties `viewControllerClass`, `viewControllerNibName` or `viewControllerStoryboardId` are mutually exclusive and are used by `XLFormButtonCell` and `XLFormSelectorCell`. If you create a custom cell then you are responsible for using them.
#### Another example
@@ -1098,10 +1100,10 @@ This is how you can set them:
#### How to change the height of one cell
If you want to change the height for all cells of one class you should subclass that cell and override the class method `formDescriptorCellHeightForRowDescriptor`.
If you want to change the height for all cells of one class you should subclass that cell and override the class method `formDescriptorCellHeightForRowDescriptor`.
If you want to change the height of one individual cell then you can set that height to the `height` property of XLFormRowDescripto like this:
```
XLFormRowDescriptor* row = ...
XLFormRowDescriptor* row = ...
row.height = 55;
```
@@ -1123,10 +1125,32 @@ You can make this happen using the `textFieldMaxNumberOfCharacters` and the `tex
Installation
--------------------------
## Swift Package Manager
Starting with Xcode 11, Swift Package Manager is the recommended and preferred way for installing dependencies in Xcode projects. Installing dependencies via SwiftPM does not require the application nor dependencies to be written in Swift.
To add XLForm to your project using SwiftPM follow these steps:
1. Open your project in Xcode
1. In the main menu, select File -> Swift Packages -> Add Package Dependency...
1. In the window, enter the package url https://github.com/xmartlabs/XLForm
1. Configure the version to be used
To use XLForm in your code, import the module or header files as needed:
```objc
#import "XLForm.h" // Obj-c
```
```swift
import XLForm // Swift
```
## CocoaPods
1. Add the following line in the project's Podfile file:
`pod 'XLForm', '~> 3.0'`.
`pod 'XLForm', '~> 4.3'`.
2. Run the command `pod install` from the Podfile folder directory.
XLForm **has no** dependencies over other pods.
@@ -1156,7 +1180,7 @@ For further details on how to create and configure the bridging header file visi
In your `Cartfile` add:
```
github "xmartlabs/XLForm" ~> 3.0
github "xmartlabs/XLForm" ~> 4.2
```
## Using git submodules
@@ -1179,8 +1203,8 @@ Requirements
-----------------------------
* ARC
* iOS 7.0 and above
* XCode 6.3+
* iOS 9.0 and above
* Xcode 9.0+ (11.0+ for installation via Swift Package Manager)
Release Notes
+2 -2
View File
@@ -3,7 +3,7 @@ include FileUtils::Verbose
namespace :test do
desc "Run the XLForm Tests"
task :ios do
run_tests('XLForm Tests', 'iphonesimulator10.2')
run_tests('XLForm Tests', 'iphonesimulator')
tests_failed unless $?.success?
end
end
@@ -17,7 +17,7 @@ task :default => 'test'
private
def run_tests(scheme, sdk)
sh("xcodebuild -workspace 'Tests/XLForm Tests.xcworkspace' -scheme '#{scheme}' -sdk '#{sdk}' -destination 'OS=10.1,name=iPhone 7' -configuration Release clean test | xcpretty -c ; exit ${PIPESTATUS[0]}") rescue nil
sh("xcodebuild -workspace 'Tests/XLForm Tests.xcworkspace' -scheme '#{scheme}' -sdk '#{sdk}' -destination 'OS=14.0,name=iPhone 11' -configuration Release clean test | xcpretty -c ; exit ${PIPESTATUS[0]}") rescue nil
end
def tests_failed
+4 -3
View File
@@ -1,9 +1,10 @@
source 'https://github.com/CocoaPods/Specs.git'
source 'https://cdn.cocoapods.org/'
project 'XLForm Tests'
inhibit_all_warnings!
platform :ios, '7.0'
platform :ios, '9.0'
target 'XLForm Tests' do
pod 'Expecta', '~> 0.3.0'
pod 'Expecta', '~> 1.0'
pod 'XLForm', :path => '../'
end
+97 -62
View File
@@ -8,13 +8,13 @@
/* Begin PBXBuildFile section */
03885A911D7DD3BD00CC183A /* XLTestTextFieldProperties.m in Sources */ = {isa = PBXBuildFile; fileRef = 03885A901D7DD3BD00CC183A /* XLTestTextFieldProperties.m */; };
17538872B9BB29167787CF50 /* libPods-XLForm Tests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E68572C5C8328F0F177BBCA1 /* libPods-XLForm Tests.a */; };
28657A3E1990879200CE8180 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 28657A3D1990879200CE8180 /* XCTest.framework */; };
28657A401990879200CE8180 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 28657A3F1990879200CE8180 /* Foundation.framework */; };
28657A421990879200CE8180 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 28657A411990879200CE8180 /* UIKit.framework */; };
28657A481990879200CE8180 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 28657A461990879200CE8180 /* InfoPlist.strings */; };
28657A5219914F9700CE8180 /* XLTestCase.m in Sources */ = {isa = PBXBuildFile; fileRef = 28657A5119914F9700CE8180 /* XLTestCase.m */; };
28657A54199154EE00CE8180 /* XLFormValidatorsTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 28657A53199154EE00CE8180 /* XLFormValidatorsTests.m */; };
39585558ED414BFBE6FFB93C /* libPods-XLForm Tests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 8189C74AF1BF64FDF4D14AE3 /* libPods-XLForm Tests.a */; };
3C5B9B7A1AC0BA33000AF1BA /* XLFormExampleTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C5B9B791AC0BA33000AF1BA /* XLFormExampleTest.m */; };
3C9817861AC30616003F6ABD /* UITextField+Test.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C9817851AC30616003F6ABD /* UITextField+Test.m */; };
6233D65F1D7DF022000E7716 /* XLTestTextViewProperties.m in Sources */ = {isa = PBXBuildFile; fileRef = 6233D65E1D7DF022000E7716 /* XLTestTextViewProperties.m */; };
@@ -33,17 +33,14 @@
28657A5019914F9700CE8180 /* XLTestCase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = XLTestCase.h; path = Test/XLTestCase.h; sourceTree = "<group>"; };
28657A5119914F9700CE8180 /* XLTestCase.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = XLTestCase.m; path = Test/XLTestCase.m; sourceTree = "<group>"; };
28657A53199154EE00CE8180 /* XLFormValidatorsTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = XLFormValidatorsTests.m; path = Test/XLFormValidatorsTests.m; sourceTree = "<group>"; };
35038A584FCFD0693D23F189 /* Pods-XLForm Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-XLForm Tests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-XLForm Tests/Pods-XLForm Tests.debug.xcconfig"; sourceTree = "<group>"; };
3BE0FA85B15844909EF36AB4 /* Pods-XLForm Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-XLForm Tests.release.xcconfig"; path = "Pods/Target Support Files/Pods-XLForm Tests/Pods-XLForm Tests.release.xcconfig"; sourceTree = "<group>"; };
3C5B9B791AC0BA33000AF1BA /* XLFormExampleTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = XLFormExampleTest.m; path = Test/XLFormExampleTest.m; sourceTree = "<group>"; };
3C9817841AC30616003F6ABD /* UITextField+Test.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "UITextField+Test.h"; path = "Helpers/UITextField+Test.h"; sourceTree = "<group>"; };
3C9817851AC30616003F6ABD /* UITextField+Test.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "UITextField+Test.m"; path = "Helpers/UITextField+Test.m"; sourceTree = "<group>"; };
6233D65E1D7DF022000E7716 /* XLTestTextViewProperties.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = XLTestTextViewProperties.m; path = Test/XLTestTextViewProperties.m; sourceTree = "<group>"; };
8ADC094C94CA7ABBB8134573 /* Pods.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.release.xcconfig; path = "Pods/Target Support Files/Pods/Pods.release.xcconfig"; sourceTree = "<group>"; };
8189C74AF1BF64FDF4D14AE3 /* libPods-XLForm Tests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-XLForm Tests.a"; sourceTree = BUILT_PRODUCTS_DIR; };
BFD111831AD8323900943D23 /* XLTestHideAndShow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = XLTestHideAndShow.m; path = Test/XLTestHideAndShow.m; sourceTree = "<group>"; };
C6B20EA1A9D9591335BEE81F /* Pods.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.debug.xcconfig; path = "Pods/Target Support Files/Pods/Pods.debug.xcconfig"; sourceTree = "<group>"; };
CEC7E8601D7342BFAF4C4060 /* libPods.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libPods.a; sourceTree = BUILT_PRODUCTS_DIR; };
E68572C5C8328F0F177BBCA1 /* libPods-XLForm Tests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-XLForm Tests.a"; sourceTree = BUILT_PRODUCTS_DIR; };
D5A9B3DB06904B24F1A8EA24 /* Pods-XLForm Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-XLForm Tests.release.xcconfig"; path = "Pods/Target Support Files/Pods-XLForm Tests/Pods-XLForm Tests.release.xcconfig"; sourceTree = "<group>"; };
F9D7EFDB6BD5884E5923B6AC /* Pods-XLForm Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-XLForm Tests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-XLForm Tests/Pods-XLForm Tests.debug.xcconfig"; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@@ -54,20 +51,29 @@
28657A3E1990879200CE8180 /* XCTest.framework in Frameworks */,
28657A421990879200CE8180 /* UIKit.framework in Frameworks */,
28657A401990879200CE8180 /* Foundation.framework in Frameworks */,
17538872B9BB29167787CF50 /* libPods-XLForm Tests.a in Frameworks */,
39585558ED414BFBE6FFB93C /* libPods-XLForm Tests.a in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
142BA587E51B2D88244F04F1 /* Pods */ = {
isa = PBXGroup;
children = (
F9D7EFDB6BD5884E5923B6AC /* Pods-XLForm Tests.debug.xcconfig */,
D5A9B3DB06904B24F1A8EA24 /* Pods-XLForm Tests.release.xcconfig */,
);
name = Pods;
sourceTree = "<group>";
};
28657A2F19907FBE00CE8180 = {
isa = PBXGroup;
children = (
28657A431990879200CE8180 /* XLForm Tests */,
28657A3C1990879200CE8180 /* Frameworks */,
28657A3B1990879200CE8180 /* Products */,
52B313F2682BC45F8E9E8132 /* Pods */,
142BA587E51B2D88244F04F1 /* Pods */,
);
sourceTree = "<group>";
};
@@ -85,8 +91,7 @@
28657A3D1990879200CE8180 /* XCTest.framework */,
28657A3F1990879200CE8180 /* Foundation.framework */,
28657A411990879200CE8180 /* UIKit.framework */,
CEC7E8601D7342BFAF4C4060 /* libPods.a */,
E68572C5C8328F0F177BBCA1 /* libPods-XLForm Tests.a */,
8189C74AF1BF64FDF4D14AE3 /* libPods-XLForm Tests.a */,
);
name = Frameworks;
sourceTree = "<group>";
@@ -134,17 +139,6 @@
name = Helpers;
sourceTree = "<group>";
};
52B313F2682BC45F8E9E8132 /* Pods */ = {
isa = PBXGroup;
children = (
C6B20EA1A9D9591335BEE81F /* Pods.debug.xcconfig */,
8ADC094C94CA7ABBB8134573 /* Pods.release.xcconfig */,
35038A584FCFD0693D23F189 /* Pods-XLForm Tests.debug.xcconfig */,
3BE0FA85B15844909EF36AB4 /* Pods-XLForm Tests.release.xcconfig */,
);
name = Pods;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
@@ -152,12 +146,11 @@
isa = PBXNativeTarget;
buildConfigurationList = 28657A4C1990879200CE8180 /* Build configuration list for PBXNativeTarget "XLForm Tests" */;
buildPhases = (
6B058765CC1143829C6943B9 /* [CP] Check Pods Manifest.lock */,
29CB07B4E0344AEB95FE5406 /* [CP] Check Pods Manifest.lock */,
28657A361990879200CE8180 /* Sources */,
28657A371990879200CE8180 /* Frameworks */,
28657A381990879200CE8180 /* Resources */,
3E5FCF05A57F40C6AF367F6D /* [CP] Copy Pods Resources */,
6A2C507B76209618EDA57426 /* [CP] Embed Pods Frameworks */,
7E96395A3A94BDD9487AE471 /* [CP] Copy Pods Resources */,
);
buildRules = (
);
@@ -174,7 +167,7 @@
28657A3019907FBE00CE8180 /* Project object */ = {
isa = PBXProject;
attributes = {
LastUpgradeCheck = 0610;
LastUpgradeCheck = 0900;
};
buildConfigurationList = 28657A3319907FBE00CE8180 /* Build configuration list for PBXProject "XLForm Tests" */;
compatibilityVersion = "Xcode 3.2";
@@ -205,49 +198,40 @@
/* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
3E5FCF05A57F40C6AF367F6D /* [CP] Copy Pods Resources */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
);
name = "[CP] Copy Pods Resources";
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-XLForm Tests/Pods-XLForm Tests-resources.sh\"\n";
showEnvVarsInLog = 0;
};
6A2C507B76209618EDA57426 /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
);
name = "[CP] Embed Pods Frameworks";
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-XLForm Tests/Pods-XLForm Tests-frameworks.sh\"\n";
showEnvVarsInLog = 0;
};
6B058765CC1143829C6943B9 /* [CP] Check Pods Manifest.lock */ = {
29CB07B4E0344AEB95FE5406 /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
"${PODS_ROOT}/Manifest.lock",
);
name = "[CP] Check Pods Manifest.lock";
outputPaths = (
"$(DERIVED_FILE_DIR)/Pods-XLForm Tests-checkManifestLockResult.txt",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n";
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
7E96395A3A94BDD9487AE471 /* [CP] Copy Pods Resources */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
"${PODS_ROOT}/Target Support Files/Pods-XLForm Tests/Pods-XLForm Tests-resources.sh",
"${PODS_ROOT}/../../XLForm/XLForm.bundle",
);
name = "[CP] Copy Pods Resources";
outputPaths = (
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/XLForm.bundle",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-XLForm Tests/Pods-XLForm Tests-resources.sh\"\n";
showEnvVarsInLog = 0;
};
/* End PBXShellScriptBuildPhase section */
@@ -284,6 +268,31 @@
28657A3419907FBE00CE8180 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
ONLY_ACTIVE_ARCH = YES;
};
name = Debug;
@@ -291,12 +300,36 @@
28657A3519907FBE00CE8180 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
};
name = Release;
};
28657A4D1990879200CE8180 /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 35038A584FCFD0693D23F189 /* Pods-XLForm Tests.debug.xcconfig */;
baseConfigurationReference = F9D7EFDB6BD5884E5923B6AC /* Pods-XLForm Tests.debug.xcconfig */;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
@@ -334,9 +367,10 @@
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
INFOPLIST_FILE = "XLForm Tests/XLForm Tests-Info.plist";
IPHONEOS_DEPLOYMENT_TARGET = 7.1;
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
LIBRARY_SEARCH_PATHS = "$(inherited)";
ONLY_ACTIVE_ARCH = YES;
PRODUCT_BUNDLE_IDENTIFIER = "com.xmartlabs.${PRODUCT_NAME:rfc1034identifier}";
PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = iphoneos;
WRAPPER_EXTENSION = xctest;
@@ -345,7 +379,7 @@
};
28657A4E1990879200CE8180 /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 3BE0FA85B15844909EF36AB4 /* Pods-XLForm Tests.release.xcconfig */;
baseConfigurationReference = D5A9B3DB06904B24F1A8EA24 /* Pods-XLForm Tests.release.xcconfig */;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
@@ -377,8 +411,9 @@
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
INFOPLIST_FILE = "XLForm Tests/XLForm Tests-Info.plist";
IPHONEOS_DEPLOYMENT_TARGET = 7.1;
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
LIBRARY_SEARCH_PATHS = "$(inherited)";
PRODUCT_BUNDLE_IDENTIFIER = "com.xmartlabs.${PRODUCT_NAME:rfc1034identifier}";
PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = iphoneos;
VALIDATE_PRODUCT = YES;
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0610"
LastUpgradeVersion = "0900"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
@@ -23,10 +23,11 @@
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
buildConfiguration = "Debug">
language = ""
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
<TestableReference
skipped = "NO">
@@ -39,15 +40,19 @@
</BuildableReference>
</TestableReference>
</Testables>
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
language = ""
launchStyle = "0"
useCustomWorkingDirectory = "NO"
buildConfiguration = "Debug"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<MacroExpansion>
<BuildableReference
@@ -62,10 +67,10 @@
</AdditionalOptions>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
buildConfiguration = "Release"
debugDocumentVersioning = "YES">
</ProfileAction>
<AnalyzeAction
+1 -1
View File
@@ -7,7 +7,7 @@
<key>CFBundleExecutable</key>
<string>${EXECUTABLE_NAME}</string>
<key>CFBundleIdentifier</key>
<string>com.xmartlabs.${PRODUCT_NAME:rfc1034identifier}</string>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
+2 -2
View File
@@ -1,6 +1,6 @@
Pod::Spec.new do |s|
s.name = 'XLForm'
s.version = '3.3.0'
s.version = '4.3.0'
s.license = { :type => 'MIT' }
s.summary = 'XLForm is the most flexible and powerful iOS library to create dynamic table-view forms.'
s.description = <<-DESC
@@ -11,7 +11,7 @@ Pod::Spec.new do |s|
s.source = { :git => 'https://github.com/xmartlabs/XLForm.git', :tag => s.version }
s.source_files = 'XLForm/XL/**/*.{h,m}'
s.requires_arc = true
s.ios.deployment_target = '7.0'
s.ios.deployment_target = '9.0'
s.ios.frameworks = 'UIKit', 'Foundation', 'CoreGraphics'
s.resource = 'XLForm/XLForm.bundle'
end
+339 -309
View File
@@ -7,164 +7,164 @@
objects = {
/* Begin PBXBuildFile section */
6442F6501C1FC3AA00C9152F /* XLFormImageCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 6442F64E1C1FC3AA00C9152F /* XLFormImageCell.h */; settings = {ATTRIBUTES = (Public, ); }; };
6442F6511C1FC3AA00C9152F /* XLFormImageCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 6442F64F1C1FC3AA00C9152F /* XLFormImageCell.m */; };
E267FD7C1BE804E200F86B42 /* XLFormBaseCell.h in Headers */ = {isa = PBXBuildFile; fileRef = E267FD2C1BE804E200F86B42 /* XLFormBaseCell.h */; settings = {ATTRIBUTES = (Public, ); }; };
E267FD7D1BE804E200F86B42 /* XLFormBaseCell.m in Sources */ = {isa = PBXBuildFile; fileRef = E267FD2D1BE804E200F86B42 /* XLFormBaseCell.m */; };
E267FD7E1BE804E200F86B42 /* XLFormButtonCell.h in Headers */ = {isa = PBXBuildFile; fileRef = E267FD2E1BE804E200F86B42 /* XLFormButtonCell.h */; settings = {ATTRIBUTES = (Public, ); }; };
E267FD7F1BE804E200F86B42 /* XLFormButtonCell.m in Sources */ = {isa = PBXBuildFile; fileRef = E267FD2F1BE804E200F86B42 /* XLFormButtonCell.m */; };
E267FD801BE804E200F86B42 /* XLFormCheckCell.h in Headers */ = {isa = PBXBuildFile; fileRef = E267FD301BE804E200F86B42 /* XLFormCheckCell.h */; settings = {ATTRIBUTES = (Public, ); }; };
E267FD811BE804E200F86B42 /* XLFormCheckCell.m in Sources */ = {isa = PBXBuildFile; fileRef = E267FD311BE804E200F86B42 /* XLFormCheckCell.m */; };
E267FD821BE804E200F86B42 /* XLFormDateCell.h in Headers */ = {isa = PBXBuildFile; fileRef = E267FD321BE804E200F86B42 /* XLFormDateCell.h */; settings = {ATTRIBUTES = (Public, ); }; };
E267FD831BE804E200F86B42 /* XLFormDateCell.m in Sources */ = {isa = PBXBuildFile; fileRef = E267FD331BE804E200F86B42 /* XLFormDateCell.m */; };
E267FD841BE804E200F86B42 /* XLFormDatePickerCell.h in Headers */ = {isa = PBXBuildFile; fileRef = E267FD341BE804E200F86B42 /* XLFormDatePickerCell.h */; settings = {ATTRIBUTES = (Public, ); }; };
E267FD851BE804E200F86B42 /* XLFormDatePickerCell.m in Sources */ = {isa = PBXBuildFile; fileRef = E267FD351BE804E200F86B42 /* XLFormDatePickerCell.m */; };
E267FD861BE804E200F86B42 /* XLFormDescriptorCell.h in Headers */ = {isa = PBXBuildFile; fileRef = E267FD361BE804E200F86B42 /* XLFormDescriptorCell.h */; settings = {ATTRIBUTES = (Public, ); }; };
E267FD871BE804E200F86B42 /* XLFormInlineRowDescriptorCell.h in Headers */ = {isa = PBXBuildFile; fileRef = E267FD371BE804E200F86B42 /* XLFormInlineRowDescriptorCell.h */; settings = {ATTRIBUTES = (Public, ); }; };
E267FD881BE804E200F86B42 /* XLFormInlineSelectorCell.h in Headers */ = {isa = PBXBuildFile; fileRef = E267FD381BE804E200F86B42 /* XLFormInlineSelectorCell.h */; settings = {ATTRIBUTES = (Public, ); }; };
E267FD891BE804E200F86B42 /* XLFormInlineSelectorCell.m in Sources */ = {isa = PBXBuildFile; fileRef = E267FD391BE804E200F86B42 /* XLFormInlineSelectorCell.m */; };
E267FD8A1BE804E200F86B42 /* XLFormLeftRightSelectorCell.h in Headers */ = {isa = PBXBuildFile; fileRef = E267FD3A1BE804E200F86B42 /* XLFormLeftRightSelectorCell.h */; settings = {ATTRIBUTES = (Public, ); }; };
E267FD8B1BE804E200F86B42 /* XLFormLeftRightSelectorCell.m in Sources */ = {isa = PBXBuildFile; fileRef = E267FD3B1BE804E200F86B42 /* XLFormLeftRightSelectorCell.m */; };
E267FD8C1BE804E200F86B42 /* XLFormPickerCell.h in Headers */ = {isa = PBXBuildFile; fileRef = E267FD3C1BE804E200F86B42 /* XLFormPickerCell.h */; settings = {ATTRIBUTES = (Public, ); }; };
E267FD8D1BE804E200F86B42 /* XLFormPickerCell.m in Sources */ = {isa = PBXBuildFile; fileRef = E267FD3D1BE804E200F86B42 /* XLFormPickerCell.m */; };
E267FD8E1BE804E200F86B42 /* XLFormSegmentedCell.h in Headers */ = {isa = PBXBuildFile; fileRef = E267FD3E1BE804E200F86B42 /* XLFormSegmentedCell.h */; settings = {ATTRIBUTES = (Public, ); }; };
E267FD8F1BE804E200F86B42 /* XLFormSegmentedCell.m in Sources */ = {isa = PBXBuildFile; fileRef = E267FD3F1BE804E200F86B42 /* XLFormSegmentedCell.m */; };
E267FD901BE804E200F86B42 /* XLFormSelectorCell.h in Headers */ = {isa = PBXBuildFile; fileRef = E267FD401BE804E200F86B42 /* XLFormSelectorCell.h */; settings = {ATTRIBUTES = (Public, ); }; };
E267FD911BE804E200F86B42 /* XLFormSelectorCell.m in Sources */ = {isa = PBXBuildFile; fileRef = E267FD411BE804E200F86B42 /* XLFormSelectorCell.m */; };
E267FD921BE804E200F86B42 /* XLFormSliderCell.h in Headers */ = {isa = PBXBuildFile; fileRef = E267FD421BE804E200F86B42 /* XLFormSliderCell.h */; settings = {ATTRIBUTES = (Public, ); }; };
E267FD931BE804E200F86B42 /* XLFormSliderCell.m in Sources */ = {isa = PBXBuildFile; fileRef = E267FD431BE804E200F86B42 /* XLFormSliderCell.m */; };
E267FD941BE804E200F86B42 /* XLFormStepCounterCell.h in Headers */ = {isa = PBXBuildFile; fileRef = E267FD441BE804E200F86B42 /* XLFormStepCounterCell.h */; settings = {ATTRIBUTES = (Public, ); }; };
E267FD951BE804E200F86B42 /* XLFormStepCounterCell.m in Sources */ = {isa = PBXBuildFile; fileRef = E267FD451BE804E200F86B42 /* XLFormStepCounterCell.m */; };
E267FD961BE804E200F86B42 /* XLFormSwitchCell.h in Headers */ = {isa = PBXBuildFile; fileRef = E267FD461BE804E200F86B42 /* XLFormSwitchCell.h */; settings = {ATTRIBUTES = (Public, ); }; };
E267FD971BE804E200F86B42 /* XLFormSwitchCell.m in Sources */ = {isa = PBXBuildFile; fileRef = E267FD471BE804E200F86B42 /* XLFormSwitchCell.m */; };
E267FD981BE804E200F86B42 /* XLFormTextFieldCell.h in Headers */ = {isa = PBXBuildFile; fileRef = E267FD481BE804E200F86B42 /* XLFormTextFieldCell.h */; settings = {ATTRIBUTES = (Public, ); }; };
E267FD991BE804E200F86B42 /* XLFormTextFieldCell.m in Sources */ = {isa = PBXBuildFile; fileRef = E267FD491BE804E200F86B42 /* XLFormTextFieldCell.m */; };
E267FD9A1BE804E200F86B42 /* XLFormTextViewCell.h in Headers */ = {isa = PBXBuildFile; fileRef = E267FD4A1BE804E200F86B42 /* XLFormTextViewCell.h */; settings = {ATTRIBUTES = (Public, ); }; };
E267FD9B1BE804E200F86B42 /* XLFormTextViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = E267FD4B1BE804E200F86B42 /* XLFormTextViewCell.m */; };
E267FD9C1BE804E200F86B42 /* XLFormOptionsObject.h in Headers */ = {isa = PBXBuildFile; fileRef = E267FD4D1BE804E200F86B42 /* XLFormOptionsObject.h */; settings = {ATTRIBUTES = (Public, ); }; };
E267FD9D1BE804E200F86B42 /* XLFormOptionsObject.m in Sources */ = {isa = PBXBuildFile; fileRef = E267FD4E1BE804E200F86B42 /* XLFormOptionsObject.m */; };
E267FD9E1BE804E200F86B42 /* XLFormOptionsViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = E267FD4F1BE804E200F86B42 /* XLFormOptionsViewController.h */; settings = {ATTRIBUTES = (Public, ); }; };
E267FD9F1BE804E200F86B42 /* XLFormOptionsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E267FD501BE804E200F86B42 /* XLFormOptionsViewController.m */; };
E267FDA01BE804E200F86B42 /* XLFormRowDescriptorViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = E267FD511BE804E200F86B42 /* XLFormRowDescriptorViewController.h */; settings = {ATTRIBUTES = (Public, ); }; };
E267FDA11BE804E200F86B42 /* XLFormViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = E267FD521BE804E200F86B42 /* XLFormViewController.h */; settings = {ATTRIBUTES = (Public, ); }; };
E267FDA21BE804E200F86B42 /* XLFormViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E267FD531BE804E200F86B42 /* XLFormViewController.m */; };
E267FDA31BE804E200F86B42 /* XLFormDescriptor.h in Headers */ = {isa = PBXBuildFile; fileRef = E267FD551BE804E200F86B42 /* XLFormDescriptor.h */; settings = {ATTRIBUTES = (Public, ); }; };
E267FDA41BE804E200F86B42 /* XLFormDescriptor.m in Sources */ = {isa = PBXBuildFile; fileRef = E267FD561BE804E200F86B42 /* XLFormDescriptor.m */; };
E267FDA51BE804E200F86B42 /* XLFormDescriptorDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = E267FD571BE804E200F86B42 /* XLFormDescriptorDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; };
E267FDA61BE804E200F86B42 /* XLFormRowDescriptor.h in Headers */ = {isa = PBXBuildFile; fileRef = E267FD581BE804E200F86B42 /* XLFormRowDescriptor.h */; settings = {ATTRIBUTES = (Public, ); }; };
E267FDA71BE804E200F86B42 /* XLFormRowDescriptor.m in Sources */ = {isa = PBXBuildFile; fileRef = E267FD591BE804E200F86B42 /* XLFormRowDescriptor.m */; };
E267FDA81BE804E200F86B42 /* XLFormSectionDescriptor.h in Headers */ = {isa = PBXBuildFile; fileRef = E267FD5A1BE804E200F86B42 /* XLFormSectionDescriptor.h */; settings = {ATTRIBUTES = (Public, ); }; };
E267FDA91BE804E200F86B42 /* XLFormSectionDescriptor.m in Sources */ = {isa = PBXBuildFile; fileRef = E267FD5B1BE804E200F86B42 /* XLFormSectionDescriptor.m */; };
E267FDAA1BE804E200F86B42 /* NSArray+XLFormAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = E267FD5D1BE804E200F86B42 /* NSArray+XLFormAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; };
E267FDAB1BE804E200F86B42 /* NSArray+XLFormAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = E267FD5E1BE804E200F86B42 /* NSArray+XLFormAdditions.m */; };
E267FDAC1BE804E200F86B42 /* NSExpression+XLFormAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = E267FD5F1BE804E200F86B42 /* NSExpression+XLFormAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; };
E267FDAD1BE804E200F86B42 /* NSExpression+XLFormAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = E267FD601BE804E200F86B42 /* NSExpression+XLFormAdditions.m */; };
E267FDAE1BE804E200F86B42 /* NSObject+XLFormAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = E267FD611BE804E200F86B42 /* NSObject+XLFormAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; };
E267FDAF1BE804E200F86B42 /* NSObject+XLFormAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = E267FD621BE804E200F86B42 /* NSObject+XLFormAdditions.m */; };
E267FDB01BE804E200F86B42 /* NSPredicate+XLFormAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = E267FD631BE804E200F86B42 /* NSPredicate+XLFormAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; };
E267FDB11BE804E200F86B42 /* NSPredicate+XLFormAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = E267FD641BE804E200F86B42 /* NSPredicate+XLFormAdditions.m */; };
E267FDB21BE804E200F86B42 /* NSString+XLFormAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = E267FD651BE804E200F86B42 /* NSString+XLFormAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; };
E267FDB31BE804E200F86B42 /* NSString+XLFormAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = E267FD661BE804E200F86B42 /* NSString+XLFormAdditions.m */; };
E267FDB41BE804E200F86B42 /* UIView+XLFormAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = E267FD671BE804E200F86B42 /* UIView+XLFormAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; };
E267FDB51BE804E200F86B42 /* UIView+XLFormAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = E267FD681BE804E200F86B42 /* UIView+XLFormAdditions.m */; };
E267FDB61BE804E200F86B42 /* XLFormRightDetailCell.h in Headers */ = {isa = PBXBuildFile; fileRef = E267FD6A1BE804E200F86B42 /* XLFormRightDetailCell.h */; settings = {ATTRIBUTES = (Public, ); }; };
E267FDB71BE804E200F86B42 /* XLFormRightDetailCell.m in Sources */ = {isa = PBXBuildFile; fileRef = E267FD6B1BE804E200F86B42 /* XLFormRightDetailCell.m */; };
E267FDB81BE804E200F86B42 /* XLFormRightImageButton.h in Headers */ = {isa = PBXBuildFile; fileRef = E267FD6C1BE804E200F86B42 /* XLFormRightImageButton.h */; settings = {ATTRIBUTES = (Public, ); }; };
E267FDB91BE804E200F86B42 /* XLFormRightImageButton.m in Sources */ = {isa = PBXBuildFile; fileRef = E267FD6D1BE804E200F86B42 /* XLFormRightImageButton.m */; };
E267FDBA1BE804E200F86B42 /* XLFormRowNavigationAccessoryView.h in Headers */ = {isa = PBXBuildFile; fileRef = E267FD6E1BE804E200F86B42 /* XLFormRowNavigationAccessoryView.h */; settings = {ATTRIBUTES = (Public, ); }; };
E267FDBB1BE804E200F86B42 /* XLFormRowNavigationAccessoryView.m in Sources */ = {isa = PBXBuildFile; fileRef = E267FD6F1BE804E200F86B42 /* XLFormRowNavigationAccessoryView.m */; };
E267FDBC1BE804E200F86B42 /* XLFormTextView.h in Headers */ = {isa = PBXBuildFile; fileRef = E267FD701BE804E200F86B42 /* XLFormTextView.h */; settings = {ATTRIBUTES = (Public, ); }; };
E267FDBD1BE804E200F86B42 /* XLFormTextView.m in Sources */ = {isa = PBXBuildFile; fileRef = E267FD711BE804E200F86B42 /* XLFormTextView.m */; };
E267FDBE1BE804E200F86B42 /* XLFormRegexValidator.h in Headers */ = {isa = PBXBuildFile; fileRef = E267FD731BE804E200F86B42 /* XLFormRegexValidator.h */; settings = {ATTRIBUTES = (Public, ); }; };
E267FDBF1BE804E200F86B42 /* XLFormRegexValidator.m in Sources */ = {isa = PBXBuildFile; fileRef = E267FD741BE804E200F86B42 /* XLFormRegexValidator.m */; };
E267FDC01BE804E200F86B42 /* XLFormValidationStatus.h in Headers */ = {isa = PBXBuildFile; fileRef = E267FD751BE804E200F86B42 /* XLFormValidationStatus.h */; settings = {ATTRIBUTES = (Public, ); }; };
E267FDC11BE804E200F86B42 /* XLFormValidationStatus.m in Sources */ = {isa = PBXBuildFile; fileRef = E267FD761BE804E200F86B42 /* XLFormValidationStatus.m */; };
E267FDC21BE804E200F86B42 /* XLFormValidator.h in Headers */ = {isa = PBXBuildFile; fileRef = E267FD771BE804E200F86B42 /* XLFormValidator.h */; settings = {ATTRIBUTES = (Public, ); }; };
E267FDC31BE804E200F86B42 /* XLFormValidator.m in Sources */ = {isa = PBXBuildFile; fileRef = E267FD781BE804E200F86B42 /* XLFormValidator.m */; };
E267FDC41BE804E200F86B42 /* XLFormValidatorProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = E267FD791BE804E200F86B42 /* XLFormValidatorProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; };
9C2695192513CEFF0059594E /* XLFormBaseCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C2695072513CEFC0059594E /* XLFormBaseCell.h */; settings = {ATTRIBUTES = (Public, ); }; };
9C26951A2513CEFF0059594E /* XLFormCheckCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 9C2695082513CEFC0059594E /* XLFormCheckCell.m */; };
9C26951B2513CEFF0059594E /* XLFormDatePickerCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C2695092513CEFC0059594E /* XLFormDatePickerCell.h */; settings = {ATTRIBUTES = (Public, ); }; };
9C26951C2513CEFF0059594E /* XLFormButtonCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C26950A2513CEFC0059594E /* XLFormButtonCell.h */; settings = {ATTRIBUTES = (Public, ); }; };
9C26951D2513CEFF0059594E /* XLFormButtonCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 9C26950B2513CEFC0059594E /* XLFormButtonCell.m */; };
9C26951E2513CEFF0059594E /* XLFormInlineSelectorCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C26950C2513CEFC0059594E /* XLFormInlineSelectorCell.h */; settings = {ATTRIBUTES = (Public, ); }; };
9C26951F2513CEFF0059594E /* XLFormDatePickerCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 9C26950D2513CEFD0059594E /* XLFormDatePickerCell.m */; };
9C2695202513CEFF0059594E /* XLFormCheckCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C26950E2513CEFD0059594E /* XLFormCheckCell.h */; settings = {ATTRIBUTES = (Public, ); }; };
9C2695212513CEFF0059594E /* XLFormImageCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C26950F2513CEFD0059594E /* XLFormImageCell.h */; settings = {ATTRIBUTES = (Public, ); }; };
9C2695222513CEFF0059594E /* XLFormLeftRightSelectorCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C2695102513CEFD0059594E /* XLFormLeftRightSelectorCell.h */; settings = {ATTRIBUTES = (Public, ); }; };
9C2695232513CEFF0059594E /* XLFormLeftRightSelectorCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 9C2695112513CEFE0059594E /* XLFormLeftRightSelectorCell.m */; };
9C2695242513CEFF0059594E /* XLFormInlineRowDescriptorCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C2695122513CEFE0059594E /* XLFormInlineRowDescriptorCell.h */; settings = {ATTRIBUTES = (Public, ); }; };
9C2695252513CEFF0059594E /* XLFormDateCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 9C2695132513CEFE0059594E /* XLFormDateCell.m */; };
9C2695262513CEFF0059594E /* XLFormInlineSelectorCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 9C2695142513CEFE0059594E /* XLFormInlineSelectorCell.m */; };
9C2695272513CEFF0059594E /* XLFormBaseCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 9C2695152513CEFE0059594E /* XLFormBaseCell.m */; };
9C2695282513CEFF0059594E /* XLFormDescriptorCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C2695162513CEFE0059594E /* XLFormDescriptorCell.h */; settings = {ATTRIBUTES = (Public, ); }; };
9C2695292513CEFF0059594E /* XLFormImageCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 9C2695172513CEFE0059594E /* XLFormImageCell.m */; };
9C26952A2513CEFF0059594E /* XLFormDateCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C2695182513CEFF0059594E /* XLFormDateCell.h */; settings = {ATTRIBUTES = (Public, ); }; };
9C26953B2513CFA70059594E /* XLFormStepCounterCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 9C26952B2513CFA60059594E /* XLFormStepCounterCell.m */; };
9C26953C2513CFA70059594E /* XLFormPickerCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 9C26952C2513CFA60059594E /* XLFormPickerCell.m */; };
9C26953D2513CFA70059594E /* XLFormSliderCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 9C26952D2513CFA60059594E /* XLFormSliderCell.m */; };
9C26953E2513CFA70059594E /* XLFormSelectorCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 9C26952E2513CFA60059594E /* XLFormSelectorCell.m */; };
9C26953F2513CFA70059594E /* XLFormTextViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 9C26952F2513CFA60059594E /* XLFormTextViewCell.m */; };
9C2695402513CFA70059594E /* XLFormTextFieldCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 9C2695302513CFA60059594E /* XLFormTextFieldCell.m */; };
9C2695412513CFA70059594E /* XLFormStepCounterCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C2695312513CFA60059594E /* XLFormStepCounterCell.h */; settings = {ATTRIBUTES = (Public, ); }; };
9C2695422513CFA70059594E /* XLFormTextFieldCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C2695322513CFA60059594E /* XLFormTextFieldCell.h */; settings = {ATTRIBUTES = (Public, ); }; };
9C2695432513CFA70059594E /* XLFormSliderCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C2695332513CFA60059594E /* XLFormSliderCell.h */; settings = {ATTRIBUTES = (Public, ); }; };
9C2695442513CFA70059594E /* XLFormTextViewCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C2695342513CFA60059594E /* XLFormTextViewCell.h */; settings = {ATTRIBUTES = (Public, ); }; };
9C2695452513CFA70059594E /* XLFormSegmentedCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 9C2695352513CFA70059594E /* XLFormSegmentedCell.m */; };
9C2695462513CFA70059594E /* XLFormPickerCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C2695362513CFA70059594E /* XLFormPickerCell.h */; settings = {ATTRIBUTES = (Public, ); }; };
9C2695472513CFA70059594E /* XLFormSwitchCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 9C2695372513CFA70059594E /* XLFormSwitchCell.m */; };
9C2695482513CFA70059594E /* XLFormSwitchCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C2695382513CFA70059594E /* XLFormSwitchCell.h */; settings = {ATTRIBUTES = (Public, ); }; };
9C2695492513CFA70059594E /* XLFormSegmentedCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C2695392513CFA70059594E /* XLFormSegmentedCell.h */; settings = {ATTRIBUTES = (Public, ); }; };
9C26954A2513CFA70059594E /* XLFormSelectorCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C26953A2513CFA70059594E /* XLFormSelectorCell.h */; settings = {ATTRIBUTES = (Public, ); }; };
9C2695522513CFF50059594E /* XLFormViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C26954B2513CFF50059594E /* XLFormViewController.h */; settings = {ATTRIBUTES = (Public, ); }; };
9C2695532513CFF50059594E /* XLFormViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 9C26954C2513CFF50059594E /* XLFormViewController.m */; };
9C2695542513CFF50059594E /* XLFormRowDescriptorViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C26954D2513CFF50059594E /* XLFormRowDescriptorViewController.h */; settings = {ATTRIBUTES = (Public, ); }; };
9C2695552513CFF50059594E /* XLFormOptionsObject.m in Sources */ = {isa = PBXBuildFile; fileRef = 9C26954E2513CFF50059594E /* XLFormOptionsObject.m */; };
9C2695562513CFF50059594E /* XLFormOptionsViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C26954F2513CFF50059594E /* XLFormOptionsViewController.h */; settings = {ATTRIBUTES = (Public, ); }; };
9C2695572513CFF50059594E /* XLFormOptionsObject.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C2695502513CFF50059594E /* XLFormOptionsObject.h */; settings = {ATTRIBUTES = (Public, ); }; };
9C2695582513CFF50059594E /* XLFormOptionsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 9C2695512513CFF50059594E /* XLFormOptionsViewController.m */; };
9C2695602513D0230059594E /* XLFormDescriptorDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C2695592513D0230059594E /* XLFormDescriptorDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; };
9C2695612513D0230059594E /* XLFormRowDescriptor.m in Sources */ = {isa = PBXBuildFile; fileRef = 9C26955A2513D0230059594E /* XLFormRowDescriptor.m */; };
9C2695622513D0230059594E /* XLFormSectionDescriptor.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C26955B2513D0230059594E /* XLFormSectionDescriptor.h */; settings = {ATTRIBUTES = (Public, ); }; };
9C2695632513D0230059594E /* XLFormRowDescriptor.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C26955C2513D0230059594E /* XLFormRowDescriptor.h */; settings = {ATTRIBUTES = (Public, ); }; };
9C2695642513D0230059594E /* XLFormDescriptor.m in Sources */ = {isa = PBXBuildFile; fileRef = 9C26955D2513D0230059594E /* XLFormDescriptor.m */; };
9C2695652513D0230059594E /* XLFormSectionDescriptor.m in Sources */ = {isa = PBXBuildFile; fileRef = 9C26955E2513D0230059594E /* XLFormSectionDescriptor.m */; };
9C2695662513D0230059594E /* XLFormDescriptor.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C26955F2513D0230059594E /* XLFormDescriptor.h */; settings = {ATTRIBUTES = (Public, ); }; };
9C2695732513D0520059594E /* NSArray+XLFormAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C2695672513D0510059594E /* NSArray+XLFormAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; };
9C2695742513D0520059594E /* NSString+XLFormAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 9C2695682513D0510059594E /* NSString+XLFormAdditions.m */; };
9C2695752513D0520059594E /* NSExpression+XLFormAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C2695692513D0510059594E /* NSExpression+XLFormAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; };
9C2695762513D0520059594E /* NSObject+XLFormAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C26956A2513D0510059594E /* NSObject+XLFormAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; };
9C2695772513D0520059594E /* NSPredicate+XLFormAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C26956B2513D0510059594E /* NSPredicate+XLFormAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; };
9C2695782513D0520059594E /* UIView+XLFormAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 9C26956C2513D0510059594E /* UIView+XLFormAdditions.m */; };
9C2695792513D0520059594E /* NSArray+XLFormAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 9C26956D2513D0510059594E /* NSArray+XLFormAdditions.m */; };
9C26957A2513D0520059594E /* NSExpression+XLFormAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 9C26956E2513D0510059594E /* NSExpression+XLFormAdditions.m */; };
9C26957B2513D0520059594E /* NSPredicate+XLFormAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 9C26956F2513D0510059594E /* NSPredicate+XLFormAdditions.m */; };
9C26957C2513D0520059594E /* UIView+XLFormAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C2695702513D0510059594E /* UIView+XLFormAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; };
9C26957D2513D0520059594E /* NSObject+XLFormAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 9C2695712513D0510059594E /* NSObject+XLFormAdditions.m */; };
9C26957E2513D0520059594E /* NSString+XLFormAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C2695722513D0520059594E /* NSString+XLFormAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; };
9C2695872513D0960059594E /* XLFormRightImageButton.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C26957F2513D0950059594E /* XLFormRightImageButton.h */; settings = {ATTRIBUTES = (Public, ); }; };
9C2695882513D0960059594E /* XLFormRightDetailCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C2695802513D0950059594E /* XLFormRightDetailCell.h */; settings = {ATTRIBUTES = (Public, ); }; };
9C2695892513D0960059594E /* XLFormTextView.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C2695812513D0950059594E /* XLFormTextView.h */; settings = {ATTRIBUTES = (Public, ); }; };
9C26958A2513D0960059594E /* XLFormRowNavigationAccessoryView.m in Sources */ = {isa = PBXBuildFile; fileRef = 9C2695822513D0950059594E /* XLFormRowNavigationAccessoryView.m */; };
9C26958B2513D0960059594E /* XLFormTextView.m in Sources */ = {isa = PBXBuildFile; fileRef = 9C2695832513D0950059594E /* XLFormTextView.m */; };
9C26958C2513D0960059594E /* XLFormRowNavigationAccessoryView.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C2695842513D0950059594E /* XLFormRowNavigationAccessoryView.h */; settings = {ATTRIBUTES = (Public, ); }; };
9C26958D2513D0960059594E /* XLFormRightImageButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 9C2695852513D0950059594E /* XLFormRightImageButton.m */; };
9C26958E2513D0960059594E /* XLFormRightDetailCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 9C2695862513D0960059594E /* XLFormRightDetailCell.m */; };
9C2695962513D0D00059594E /* XLFormValidationStatus.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C26958F2513D0CF0059594E /* XLFormValidationStatus.h */; settings = {ATTRIBUTES = (Public, ); }; };
9C2695972513D0D00059594E /* XLFormValidationStatus.m in Sources */ = {isa = PBXBuildFile; fileRef = 9C2695902513D0CF0059594E /* XLFormValidationStatus.m */; };
9C2695982513D0D00059594E /* XLFormValidator.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C2695912513D0CF0059594E /* XLFormValidator.h */; settings = {ATTRIBUTES = (Public, ); }; };
9C2695992513D0D00059594E /* XLFormRegexValidator.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C2695922513D0CF0059594E /* XLFormRegexValidator.h */; settings = {ATTRIBUTES = (Public, ); }; };
9C26959A2513D0D00059594E /* XLFormRegexValidator.m in Sources */ = {isa = PBXBuildFile; fileRef = 9C2695932513D0D00059594E /* XLFormRegexValidator.m */; };
9C26959B2513D0D00059594E /* XLFormValidatorProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C2695942513D0D00059594E /* XLFormValidatorProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; };
9C26959C2513D0D00059594E /* XLFormValidator.m in Sources */ = {isa = PBXBuildFile; fileRef = 9C2695952513D0D00059594E /* XLFormValidator.m */; };
E267FDC51BE804E200F86B42 /* XLForm.h in Headers */ = {isa = PBXBuildFile; fileRef = E267FD7A1BE804E200F86B42 /* XLForm.h */; settings = {ATTRIBUTES = (Public, ); }; };
E267FDC61BE804E200F86B42 /* XLForm.m in Sources */ = {isa = PBXBuildFile; fileRef = E267FD7B1BE804E200F86B42 /* XLForm.m */; };
E267FDC81BE806D000F86B42 /* XLForm.bundle in Resources */ = {isa = PBXBuildFile; fileRef = E267FDC71BE806D000F86B42 /* XLForm.bundle */; };
/* End PBXBuildFile section */
/* Begin PBXFileReference section */
6442F64E1C1FC3AA00C9152F /* XLFormImageCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XLFormImageCell.h; sourceTree = "<group>"; };
6442F64F1C1FC3AA00C9152F /* XLFormImageCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XLFormImageCell.m; sourceTree = "<group>"; };
9C2695072513CEFC0059594E /* XLFormBaseCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = XLFormBaseCell.h; path = XLForm/XL/XLFormBaseCell.h; sourceTree = SOURCE_ROOT; };
9C2695082513CEFC0059594E /* XLFormCheckCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = XLFormCheckCell.m; path = XLForm/XL/XLFormCheckCell.m; sourceTree = SOURCE_ROOT; };
9C2695092513CEFC0059594E /* XLFormDatePickerCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = XLFormDatePickerCell.h; path = XLForm/XL/XLFormDatePickerCell.h; sourceTree = SOURCE_ROOT; };
9C26950A2513CEFC0059594E /* XLFormButtonCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = XLFormButtonCell.h; path = XLForm/XL/XLFormButtonCell.h; sourceTree = SOURCE_ROOT; };
9C26950B2513CEFC0059594E /* XLFormButtonCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = XLFormButtonCell.m; path = XLForm/XL/XLFormButtonCell.m; sourceTree = SOURCE_ROOT; };
9C26950C2513CEFC0059594E /* XLFormInlineSelectorCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = XLFormInlineSelectorCell.h; path = XLForm/XL/XLFormInlineSelectorCell.h; sourceTree = SOURCE_ROOT; };
9C26950D2513CEFD0059594E /* XLFormDatePickerCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = XLFormDatePickerCell.m; path = XLForm/XL/XLFormDatePickerCell.m; sourceTree = SOURCE_ROOT; };
9C26950E2513CEFD0059594E /* XLFormCheckCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = XLFormCheckCell.h; path = XLForm/XL/XLFormCheckCell.h; sourceTree = SOURCE_ROOT; };
9C26950F2513CEFD0059594E /* XLFormImageCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = XLFormImageCell.h; path = XLForm/XL/XLFormImageCell.h; sourceTree = SOURCE_ROOT; };
9C2695102513CEFD0059594E /* XLFormLeftRightSelectorCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = XLFormLeftRightSelectorCell.h; path = XLForm/XL/XLFormLeftRightSelectorCell.h; sourceTree = SOURCE_ROOT; };
9C2695112513CEFE0059594E /* XLFormLeftRightSelectorCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = XLFormLeftRightSelectorCell.m; path = XLForm/XL/XLFormLeftRightSelectorCell.m; sourceTree = SOURCE_ROOT; };
9C2695122513CEFE0059594E /* XLFormInlineRowDescriptorCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = XLFormInlineRowDescriptorCell.h; path = XLForm/XL/XLFormInlineRowDescriptorCell.h; sourceTree = SOURCE_ROOT; };
9C2695132513CEFE0059594E /* XLFormDateCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = XLFormDateCell.m; path = XLForm/XL/XLFormDateCell.m; sourceTree = SOURCE_ROOT; };
9C2695142513CEFE0059594E /* XLFormInlineSelectorCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = XLFormInlineSelectorCell.m; path = XLForm/XL/XLFormInlineSelectorCell.m; sourceTree = SOURCE_ROOT; };
9C2695152513CEFE0059594E /* XLFormBaseCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = XLFormBaseCell.m; path = XLForm/XL/XLFormBaseCell.m; sourceTree = SOURCE_ROOT; };
9C2695162513CEFE0059594E /* XLFormDescriptorCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = XLFormDescriptorCell.h; path = XLForm/XL/XLFormDescriptorCell.h; sourceTree = SOURCE_ROOT; };
9C2695172513CEFE0059594E /* XLFormImageCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = XLFormImageCell.m; path = XLForm/XL/XLFormImageCell.m; sourceTree = SOURCE_ROOT; };
9C2695182513CEFF0059594E /* XLFormDateCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = XLFormDateCell.h; path = XLForm/XL/XLFormDateCell.h; sourceTree = SOURCE_ROOT; };
9C26952B2513CFA60059594E /* XLFormStepCounterCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = XLFormStepCounterCell.m; path = XL/XLFormStepCounterCell.m; sourceTree = "<group>"; };
9C26952C2513CFA60059594E /* XLFormPickerCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = XLFormPickerCell.m; path = XL/XLFormPickerCell.m; sourceTree = "<group>"; };
9C26952D2513CFA60059594E /* XLFormSliderCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = XLFormSliderCell.m; path = XL/XLFormSliderCell.m; sourceTree = "<group>"; };
9C26952E2513CFA60059594E /* XLFormSelectorCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = XLFormSelectorCell.m; path = XL/XLFormSelectorCell.m; sourceTree = "<group>"; };
9C26952F2513CFA60059594E /* XLFormTextViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = XLFormTextViewCell.m; path = XL/XLFormTextViewCell.m; sourceTree = "<group>"; };
9C2695302513CFA60059594E /* XLFormTextFieldCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = XLFormTextFieldCell.m; path = XL/XLFormTextFieldCell.m; sourceTree = "<group>"; };
9C2695312513CFA60059594E /* XLFormStepCounterCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = XLFormStepCounterCell.h; path = XL/XLFormStepCounterCell.h; sourceTree = "<group>"; };
9C2695322513CFA60059594E /* XLFormTextFieldCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = XLFormTextFieldCell.h; path = XL/XLFormTextFieldCell.h; sourceTree = "<group>"; };
9C2695332513CFA60059594E /* XLFormSliderCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = XLFormSliderCell.h; path = XL/XLFormSliderCell.h; sourceTree = "<group>"; };
9C2695342513CFA60059594E /* XLFormTextViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = XLFormTextViewCell.h; path = XL/XLFormTextViewCell.h; sourceTree = "<group>"; };
9C2695352513CFA70059594E /* XLFormSegmentedCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = XLFormSegmentedCell.m; path = XL/XLFormSegmentedCell.m; sourceTree = "<group>"; };
9C2695362513CFA70059594E /* XLFormPickerCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = XLFormPickerCell.h; path = XL/XLFormPickerCell.h; sourceTree = "<group>"; };
9C2695372513CFA70059594E /* XLFormSwitchCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = XLFormSwitchCell.m; path = XL/XLFormSwitchCell.m; sourceTree = "<group>"; };
9C2695382513CFA70059594E /* XLFormSwitchCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = XLFormSwitchCell.h; path = XL/XLFormSwitchCell.h; sourceTree = "<group>"; };
9C2695392513CFA70059594E /* XLFormSegmentedCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = XLFormSegmentedCell.h; path = XL/XLFormSegmentedCell.h; sourceTree = "<group>"; };
9C26953A2513CFA70059594E /* XLFormSelectorCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = XLFormSelectorCell.h; path = XL/XLFormSelectorCell.h; sourceTree = "<group>"; };
9C26954B2513CFF50059594E /* XLFormViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = XLFormViewController.h; path = XL/XLFormViewController.h; sourceTree = "<group>"; };
9C26954C2513CFF50059594E /* XLFormViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = XLFormViewController.m; path = XL/XLFormViewController.m; sourceTree = "<group>"; };
9C26954D2513CFF50059594E /* XLFormRowDescriptorViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = XLFormRowDescriptorViewController.h; path = XL/XLFormRowDescriptorViewController.h; sourceTree = "<group>"; };
9C26954E2513CFF50059594E /* XLFormOptionsObject.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = XLFormOptionsObject.m; path = XL/XLFormOptionsObject.m; sourceTree = "<group>"; };
9C26954F2513CFF50059594E /* XLFormOptionsViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = XLFormOptionsViewController.h; path = XL/XLFormOptionsViewController.h; sourceTree = "<group>"; };
9C2695502513CFF50059594E /* XLFormOptionsObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = XLFormOptionsObject.h; path = XL/XLFormOptionsObject.h; sourceTree = "<group>"; };
9C2695512513CFF50059594E /* XLFormOptionsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = XLFormOptionsViewController.m; path = XL/XLFormOptionsViewController.m; sourceTree = "<group>"; };
9C2695592513D0230059594E /* XLFormDescriptorDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = XLFormDescriptorDelegate.h; path = XL/XLFormDescriptorDelegate.h; sourceTree = "<group>"; };
9C26955A2513D0230059594E /* XLFormRowDescriptor.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = XLFormRowDescriptor.m; path = XL/XLFormRowDescriptor.m; sourceTree = "<group>"; };
9C26955B2513D0230059594E /* XLFormSectionDescriptor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = XLFormSectionDescriptor.h; path = XL/XLFormSectionDescriptor.h; sourceTree = "<group>"; };
9C26955C2513D0230059594E /* XLFormRowDescriptor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = XLFormRowDescriptor.h; path = XL/XLFormRowDescriptor.h; sourceTree = "<group>"; };
9C26955D2513D0230059594E /* XLFormDescriptor.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = XLFormDescriptor.m; path = XL/XLFormDescriptor.m; sourceTree = "<group>"; };
9C26955E2513D0230059594E /* XLFormSectionDescriptor.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = XLFormSectionDescriptor.m; path = XL/XLFormSectionDescriptor.m; sourceTree = "<group>"; };
9C26955F2513D0230059594E /* XLFormDescriptor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = XLFormDescriptor.h; path = XL/XLFormDescriptor.h; sourceTree = "<group>"; };
9C2695672513D0510059594E /* NSArray+XLFormAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSArray+XLFormAdditions.h"; path = "XL/NSArray+XLFormAdditions.h"; sourceTree = "<group>"; };
9C2695682513D0510059594E /* NSString+XLFormAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSString+XLFormAdditions.m"; path = "XL/NSString+XLFormAdditions.m"; sourceTree = "<group>"; };
9C2695692513D0510059594E /* NSExpression+XLFormAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSExpression+XLFormAdditions.h"; path = "XL/NSExpression+XLFormAdditions.h"; sourceTree = "<group>"; };
9C26956A2513D0510059594E /* NSObject+XLFormAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSObject+XLFormAdditions.h"; path = "XL/NSObject+XLFormAdditions.h"; sourceTree = "<group>"; };
9C26956B2513D0510059594E /* NSPredicate+XLFormAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSPredicate+XLFormAdditions.h"; path = "XL/NSPredicate+XLFormAdditions.h"; sourceTree = "<group>"; };
9C26956C2513D0510059594E /* UIView+XLFormAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "UIView+XLFormAdditions.m"; path = "XL/UIView+XLFormAdditions.m"; sourceTree = "<group>"; };
9C26956D2513D0510059594E /* NSArray+XLFormAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSArray+XLFormAdditions.m"; path = "XL/NSArray+XLFormAdditions.m"; sourceTree = "<group>"; };
9C26956E2513D0510059594E /* NSExpression+XLFormAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSExpression+XLFormAdditions.m"; path = "XL/NSExpression+XLFormAdditions.m"; sourceTree = "<group>"; };
9C26956F2513D0510059594E /* NSPredicate+XLFormAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSPredicate+XLFormAdditions.m"; path = "XL/NSPredicate+XLFormAdditions.m"; sourceTree = "<group>"; };
9C2695702513D0510059594E /* UIView+XLFormAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "UIView+XLFormAdditions.h"; path = "XL/UIView+XLFormAdditions.h"; sourceTree = "<group>"; };
9C2695712513D0510059594E /* NSObject+XLFormAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSObject+XLFormAdditions.m"; path = "XL/NSObject+XLFormAdditions.m"; sourceTree = "<group>"; };
9C2695722513D0520059594E /* NSString+XLFormAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSString+XLFormAdditions.h"; path = "XL/NSString+XLFormAdditions.h"; sourceTree = "<group>"; };
9C26957F2513D0950059594E /* XLFormRightImageButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = XLFormRightImageButton.h; path = XL/XLFormRightImageButton.h; sourceTree = "<group>"; };
9C2695802513D0950059594E /* XLFormRightDetailCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = XLFormRightDetailCell.h; path = XL/XLFormRightDetailCell.h; sourceTree = "<group>"; };
9C2695812513D0950059594E /* XLFormTextView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = XLFormTextView.h; path = XL/XLFormTextView.h; sourceTree = "<group>"; };
9C2695822513D0950059594E /* XLFormRowNavigationAccessoryView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = XLFormRowNavigationAccessoryView.m; path = XL/XLFormRowNavigationAccessoryView.m; sourceTree = "<group>"; };
9C2695832513D0950059594E /* XLFormTextView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = XLFormTextView.m; path = XL/XLFormTextView.m; sourceTree = "<group>"; };
9C2695842513D0950059594E /* XLFormRowNavigationAccessoryView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = XLFormRowNavigationAccessoryView.h; path = XL/XLFormRowNavigationAccessoryView.h; sourceTree = "<group>"; };
9C2695852513D0950059594E /* XLFormRightImageButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = XLFormRightImageButton.m; path = XL/XLFormRightImageButton.m; sourceTree = "<group>"; };
9C2695862513D0960059594E /* XLFormRightDetailCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = XLFormRightDetailCell.m; path = XL/XLFormRightDetailCell.m; sourceTree = "<group>"; };
9C26958F2513D0CF0059594E /* XLFormValidationStatus.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = XLFormValidationStatus.h; path = XLForm/XL/XLFormValidationStatus.h; sourceTree = SOURCE_ROOT; };
9C2695902513D0CF0059594E /* XLFormValidationStatus.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = XLFormValidationStatus.m; path = XLForm/XL/XLFormValidationStatus.m; sourceTree = SOURCE_ROOT; };
9C2695912513D0CF0059594E /* XLFormValidator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = XLFormValidator.h; path = XLForm/XL/XLFormValidator.h; sourceTree = SOURCE_ROOT; };
9C2695922513D0CF0059594E /* XLFormRegexValidator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = XLFormRegexValidator.h; path = XLForm/XL/XLFormRegexValidator.h; sourceTree = SOURCE_ROOT; };
9C2695932513D0D00059594E /* XLFormRegexValidator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = XLFormRegexValidator.m; path = XLForm/XL/XLFormRegexValidator.m; sourceTree = SOURCE_ROOT; };
9C2695942513D0D00059594E /* XLFormValidatorProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = XLFormValidatorProtocol.h; path = XLForm/XL/XLFormValidatorProtocol.h; sourceTree = SOURCE_ROOT; };
9C2695952513D0D00059594E /* XLFormValidator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = XLFormValidator.m; path = XLForm/XL/XLFormValidator.m; sourceTree = SOURCE_ROOT; };
E267FD201BE8048900F86B42 /* XLForm.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = XLForm.framework; sourceTree = BUILT_PRODUCTS_DIR; };
E267FD251BE8048900F86B42 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
E267FD2C1BE804E200F86B42 /* XLFormBaseCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XLFormBaseCell.h; sourceTree = "<group>"; };
E267FD2D1BE804E200F86B42 /* XLFormBaseCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XLFormBaseCell.m; sourceTree = "<group>"; };
E267FD2E1BE804E200F86B42 /* XLFormButtonCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XLFormButtonCell.h; sourceTree = "<group>"; };
E267FD2F1BE804E200F86B42 /* XLFormButtonCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XLFormButtonCell.m; sourceTree = "<group>"; };
E267FD301BE804E200F86B42 /* XLFormCheckCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XLFormCheckCell.h; sourceTree = "<group>"; };
E267FD311BE804E200F86B42 /* XLFormCheckCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XLFormCheckCell.m; sourceTree = "<group>"; };
E267FD321BE804E200F86B42 /* XLFormDateCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XLFormDateCell.h; sourceTree = "<group>"; };
E267FD331BE804E200F86B42 /* XLFormDateCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XLFormDateCell.m; sourceTree = "<group>"; };
E267FD341BE804E200F86B42 /* XLFormDatePickerCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XLFormDatePickerCell.h; sourceTree = "<group>"; };
E267FD351BE804E200F86B42 /* XLFormDatePickerCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XLFormDatePickerCell.m; sourceTree = "<group>"; };
E267FD361BE804E200F86B42 /* XLFormDescriptorCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XLFormDescriptorCell.h; sourceTree = "<group>"; };
E267FD371BE804E200F86B42 /* XLFormInlineRowDescriptorCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XLFormInlineRowDescriptorCell.h; sourceTree = "<group>"; };
E267FD381BE804E200F86B42 /* XLFormInlineSelectorCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XLFormInlineSelectorCell.h; sourceTree = "<group>"; };
E267FD391BE804E200F86B42 /* XLFormInlineSelectorCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XLFormInlineSelectorCell.m; sourceTree = "<group>"; };
E267FD3A1BE804E200F86B42 /* XLFormLeftRightSelectorCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XLFormLeftRightSelectorCell.h; sourceTree = "<group>"; };
E267FD3B1BE804E200F86B42 /* XLFormLeftRightSelectorCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XLFormLeftRightSelectorCell.m; sourceTree = "<group>"; };
E267FD3C1BE804E200F86B42 /* XLFormPickerCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XLFormPickerCell.h; sourceTree = "<group>"; };
E267FD3D1BE804E200F86B42 /* XLFormPickerCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XLFormPickerCell.m; sourceTree = "<group>"; };
E267FD3E1BE804E200F86B42 /* XLFormSegmentedCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XLFormSegmentedCell.h; sourceTree = "<group>"; };
E267FD3F1BE804E200F86B42 /* XLFormSegmentedCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XLFormSegmentedCell.m; sourceTree = "<group>"; };
E267FD401BE804E200F86B42 /* XLFormSelectorCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XLFormSelectorCell.h; sourceTree = "<group>"; };
E267FD411BE804E200F86B42 /* XLFormSelectorCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XLFormSelectorCell.m; sourceTree = "<group>"; };
E267FD421BE804E200F86B42 /* XLFormSliderCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XLFormSliderCell.h; sourceTree = "<group>"; };
E267FD431BE804E200F86B42 /* XLFormSliderCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XLFormSliderCell.m; sourceTree = "<group>"; };
E267FD441BE804E200F86B42 /* XLFormStepCounterCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XLFormStepCounterCell.h; sourceTree = "<group>"; };
E267FD451BE804E200F86B42 /* XLFormStepCounterCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XLFormStepCounterCell.m; sourceTree = "<group>"; };
E267FD461BE804E200F86B42 /* XLFormSwitchCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XLFormSwitchCell.h; sourceTree = "<group>"; };
E267FD471BE804E200F86B42 /* XLFormSwitchCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XLFormSwitchCell.m; sourceTree = "<group>"; };
E267FD481BE804E200F86B42 /* XLFormTextFieldCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XLFormTextFieldCell.h; sourceTree = "<group>"; };
E267FD491BE804E200F86B42 /* XLFormTextFieldCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XLFormTextFieldCell.m; sourceTree = "<group>"; };
E267FD4A1BE804E200F86B42 /* XLFormTextViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XLFormTextViewCell.h; sourceTree = "<group>"; };
E267FD4B1BE804E200F86B42 /* XLFormTextViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XLFormTextViewCell.m; sourceTree = "<group>"; };
E267FD4D1BE804E200F86B42 /* XLFormOptionsObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XLFormOptionsObject.h; sourceTree = "<group>"; };
E267FD4E1BE804E200F86B42 /* XLFormOptionsObject.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XLFormOptionsObject.m; sourceTree = "<group>"; };
E267FD4F1BE804E200F86B42 /* XLFormOptionsViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XLFormOptionsViewController.h; sourceTree = "<group>"; };
E267FD501BE804E200F86B42 /* XLFormOptionsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XLFormOptionsViewController.m; sourceTree = "<group>"; };
E267FD511BE804E200F86B42 /* XLFormRowDescriptorViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XLFormRowDescriptorViewController.h; sourceTree = "<group>"; };
E267FD521BE804E200F86B42 /* XLFormViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XLFormViewController.h; sourceTree = "<group>"; };
E267FD531BE804E200F86B42 /* XLFormViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XLFormViewController.m; sourceTree = "<group>"; };
E267FD551BE804E200F86B42 /* XLFormDescriptor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XLFormDescriptor.h; sourceTree = "<group>"; };
E267FD561BE804E200F86B42 /* XLFormDescriptor.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XLFormDescriptor.m; sourceTree = "<group>"; };
E267FD571BE804E200F86B42 /* XLFormDescriptorDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XLFormDescriptorDelegate.h; sourceTree = "<group>"; };
E267FD581BE804E200F86B42 /* XLFormRowDescriptor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XLFormRowDescriptor.h; sourceTree = "<group>"; };
E267FD591BE804E200F86B42 /* XLFormRowDescriptor.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XLFormRowDescriptor.m; sourceTree = "<group>"; };
E267FD5A1BE804E200F86B42 /* XLFormSectionDescriptor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XLFormSectionDescriptor.h; sourceTree = "<group>"; };
E267FD5B1BE804E200F86B42 /* XLFormSectionDescriptor.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XLFormSectionDescriptor.m; sourceTree = "<group>"; };
E267FD5D1BE804E200F86B42 /* NSArray+XLFormAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSArray+XLFormAdditions.h"; sourceTree = "<group>"; };
E267FD5E1BE804E200F86B42 /* NSArray+XLFormAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSArray+XLFormAdditions.m"; sourceTree = "<group>"; };
E267FD5F1BE804E200F86B42 /* NSExpression+XLFormAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSExpression+XLFormAdditions.h"; sourceTree = "<group>"; };
E267FD601BE804E200F86B42 /* NSExpression+XLFormAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSExpression+XLFormAdditions.m"; sourceTree = "<group>"; };
E267FD611BE804E200F86B42 /* NSObject+XLFormAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSObject+XLFormAdditions.h"; sourceTree = "<group>"; };
E267FD621BE804E200F86B42 /* NSObject+XLFormAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSObject+XLFormAdditions.m"; sourceTree = "<group>"; };
E267FD631BE804E200F86B42 /* NSPredicate+XLFormAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSPredicate+XLFormAdditions.h"; sourceTree = "<group>"; };
E267FD641BE804E200F86B42 /* NSPredicate+XLFormAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSPredicate+XLFormAdditions.m"; sourceTree = "<group>"; };
E267FD651BE804E200F86B42 /* NSString+XLFormAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSString+XLFormAdditions.h"; sourceTree = "<group>"; };
E267FD661BE804E200F86B42 /* NSString+XLFormAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSString+XLFormAdditions.m"; sourceTree = "<group>"; };
E267FD671BE804E200F86B42 /* UIView+XLFormAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIView+XLFormAdditions.h"; sourceTree = "<group>"; };
E267FD681BE804E200F86B42 /* UIView+XLFormAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIView+XLFormAdditions.m"; sourceTree = "<group>"; };
E267FD6A1BE804E200F86B42 /* XLFormRightDetailCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XLFormRightDetailCell.h; sourceTree = "<group>"; };
E267FD6B1BE804E200F86B42 /* XLFormRightDetailCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XLFormRightDetailCell.m; sourceTree = "<group>"; };
E267FD6C1BE804E200F86B42 /* XLFormRightImageButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XLFormRightImageButton.h; sourceTree = "<group>"; };
E267FD6D1BE804E200F86B42 /* XLFormRightImageButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XLFormRightImageButton.m; sourceTree = "<group>"; };
E267FD6E1BE804E200F86B42 /* XLFormRowNavigationAccessoryView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XLFormRowNavigationAccessoryView.h; sourceTree = "<group>"; };
E267FD6F1BE804E200F86B42 /* XLFormRowNavigationAccessoryView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XLFormRowNavigationAccessoryView.m; sourceTree = "<group>"; };
E267FD701BE804E200F86B42 /* XLFormTextView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XLFormTextView.h; sourceTree = "<group>"; };
E267FD711BE804E200F86B42 /* XLFormTextView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XLFormTextView.m; sourceTree = "<group>"; };
E267FD731BE804E200F86B42 /* XLFormRegexValidator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XLFormRegexValidator.h; sourceTree = "<group>"; };
E267FD741BE804E200F86B42 /* XLFormRegexValidator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XLFormRegexValidator.m; sourceTree = "<group>"; };
E267FD751BE804E200F86B42 /* XLFormValidationStatus.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XLFormValidationStatus.h; sourceTree = "<group>"; };
E267FD761BE804E200F86B42 /* XLFormValidationStatus.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XLFormValidationStatus.m; sourceTree = "<group>"; };
E267FD771BE804E200F86B42 /* XLFormValidator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XLFormValidator.h; sourceTree = "<group>"; };
E267FD781BE804E200F86B42 /* XLFormValidator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XLFormValidator.m; sourceTree = "<group>"; };
E267FD791BE804E200F86B42 /* XLFormValidatorProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XLFormValidatorProtocol.h; sourceTree = "<group>"; };
E267FD7A1BE804E200F86B42 /* XLForm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = XLForm.h; path = XL/XLForm.h; sourceTree = "<group>"; };
E267FD7B1BE804E200F86B42 /* XLForm.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = XLForm.m; path = XL/XLForm.m; sourceTree = "<group>"; };
E267FDC71BE806D000F86B42 /* XLForm.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = XLForm.bundle; sourceTree = "<group>"; };
@@ -216,124 +216,119 @@
E267FD2B1BE804E200F86B42 /* Cell */ = {
isa = PBXGroup;
children = (
E267FD2C1BE804E200F86B42 /* XLFormBaseCell.h */,
E267FD2D1BE804E200F86B42 /* XLFormBaseCell.m */,
E267FD2E1BE804E200F86B42 /* XLFormButtonCell.h */,
E267FD2F1BE804E200F86B42 /* XLFormButtonCell.m */,
E267FD301BE804E200F86B42 /* XLFormCheckCell.h */,
E267FD311BE804E200F86B42 /* XLFormCheckCell.m */,
E267FD321BE804E200F86B42 /* XLFormDateCell.h */,
E267FD331BE804E200F86B42 /* XLFormDateCell.m */,
E267FD341BE804E200F86B42 /* XLFormDatePickerCell.h */,
E267FD351BE804E200F86B42 /* XLFormDatePickerCell.m */,
E267FD361BE804E200F86B42 /* XLFormDescriptorCell.h */,
6442F64E1C1FC3AA00C9152F /* XLFormImageCell.h */,
6442F64F1C1FC3AA00C9152F /* XLFormImageCell.m */,
E267FD371BE804E200F86B42 /* XLFormInlineRowDescriptorCell.h */,
E267FD381BE804E200F86B42 /* XLFormInlineSelectorCell.h */,
E267FD391BE804E200F86B42 /* XLFormInlineSelectorCell.m */,
E267FD3A1BE804E200F86B42 /* XLFormLeftRightSelectorCell.h */,
E267FD3B1BE804E200F86B42 /* XLFormLeftRightSelectorCell.m */,
E267FD3C1BE804E200F86B42 /* XLFormPickerCell.h */,
E267FD3D1BE804E200F86B42 /* XLFormPickerCell.m */,
E267FD3E1BE804E200F86B42 /* XLFormSegmentedCell.h */,
E267FD3F1BE804E200F86B42 /* XLFormSegmentedCell.m */,
E267FD401BE804E200F86B42 /* XLFormSelectorCell.h */,
E267FD411BE804E200F86B42 /* XLFormSelectorCell.m */,
E267FD421BE804E200F86B42 /* XLFormSliderCell.h */,
E267FD431BE804E200F86B42 /* XLFormSliderCell.m */,
E267FD441BE804E200F86B42 /* XLFormStepCounterCell.h */,
E267FD451BE804E200F86B42 /* XLFormStepCounterCell.m */,
E267FD461BE804E200F86B42 /* XLFormSwitchCell.h */,
E267FD471BE804E200F86B42 /* XLFormSwitchCell.m */,
E267FD481BE804E200F86B42 /* XLFormTextFieldCell.h */,
E267FD491BE804E200F86B42 /* XLFormTextFieldCell.m */,
E267FD4A1BE804E200F86B42 /* XLFormTextViewCell.h */,
E267FD4B1BE804E200F86B42 /* XLFormTextViewCell.m */,
9C2695072513CEFC0059594E /* XLFormBaseCell.h */,
9C2695152513CEFE0059594E /* XLFormBaseCell.m */,
9C26950A2513CEFC0059594E /* XLFormButtonCell.h */,
9C26950B2513CEFC0059594E /* XLFormButtonCell.m */,
9C26950E2513CEFD0059594E /* XLFormCheckCell.h */,
9C2695082513CEFC0059594E /* XLFormCheckCell.m */,
9C2695182513CEFF0059594E /* XLFormDateCell.h */,
9C2695132513CEFE0059594E /* XLFormDateCell.m */,
9C2695092513CEFC0059594E /* XLFormDatePickerCell.h */,
9C26950D2513CEFD0059594E /* XLFormDatePickerCell.m */,
9C2695162513CEFE0059594E /* XLFormDescriptorCell.h */,
9C26950F2513CEFD0059594E /* XLFormImageCell.h */,
9C2695172513CEFE0059594E /* XLFormImageCell.m */,
9C2695122513CEFE0059594E /* XLFormInlineRowDescriptorCell.h */,
9C26950C2513CEFC0059594E /* XLFormInlineSelectorCell.h */,
9C2695142513CEFE0059594E /* XLFormInlineSelectorCell.m */,
9C2695102513CEFD0059594E /* XLFormLeftRightSelectorCell.h */,
9C2695112513CEFE0059594E /* XLFormLeftRightSelectorCell.m */,
9C2695362513CFA70059594E /* XLFormPickerCell.h */,
9C26952C2513CFA60059594E /* XLFormPickerCell.m */,
9C2695392513CFA70059594E /* XLFormSegmentedCell.h */,
9C2695352513CFA70059594E /* XLFormSegmentedCell.m */,
9C26953A2513CFA70059594E /* XLFormSelectorCell.h */,
9C26952E2513CFA60059594E /* XLFormSelectorCell.m */,
9C2695332513CFA60059594E /* XLFormSliderCell.h */,
9C26952D2513CFA60059594E /* XLFormSliderCell.m */,
9C2695312513CFA60059594E /* XLFormStepCounterCell.h */,
9C26952B2513CFA60059594E /* XLFormStepCounterCell.m */,
9C2695382513CFA70059594E /* XLFormSwitchCell.h */,
9C2695372513CFA70059594E /* XLFormSwitchCell.m */,
9C2695322513CFA60059594E /* XLFormTextFieldCell.h */,
9C2695302513CFA60059594E /* XLFormTextFieldCell.m */,
9C2695342513CFA60059594E /* XLFormTextViewCell.h */,
9C26952F2513CFA60059594E /* XLFormTextViewCell.m */,
);
name = Cell;
path = XL/Cell;
sourceTree = "<group>";
};
E267FD4C1BE804E200F86B42 /* Controllers */ = {
isa = PBXGroup;
children = (
E267FD4D1BE804E200F86B42 /* XLFormOptionsObject.h */,
E267FD4E1BE804E200F86B42 /* XLFormOptionsObject.m */,
E267FD4F1BE804E200F86B42 /* XLFormOptionsViewController.h */,
E267FD501BE804E200F86B42 /* XLFormOptionsViewController.m */,
E267FD511BE804E200F86B42 /* XLFormRowDescriptorViewController.h */,
E267FD521BE804E200F86B42 /* XLFormViewController.h */,
E267FD531BE804E200F86B42 /* XLFormViewController.m */,
9C2695502513CFF50059594E /* XLFormOptionsObject.h */,
9C26954E2513CFF50059594E /* XLFormOptionsObject.m */,
9C26954F2513CFF50059594E /* XLFormOptionsViewController.h */,
9C2695512513CFF50059594E /* XLFormOptionsViewController.m */,
9C26954D2513CFF50059594E /* XLFormRowDescriptorViewController.h */,
9C26954B2513CFF50059594E /* XLFormViewController.h */,
9C26954C2513CFF50059594E /* XLFormViewController.m */,
);
name = Controllers;
path = XL/Controllers;
sourceTree = "<group>";
};
E267FD541BE804E200F86B42 /* Descriptors */ = {
isa = PBXGroup;
children = (
E267FD551BE804E200F86B42 /* XLFormDescriptor.h */,
E267FD561BE804E200F86B42 /* XLFormDescriptor.m */,
E267FD571BE804E200F86B42 /* XLFormDescriptorDelegate.h */,
E267FD581BE804E200F86B42 /* XLFormRowDescriptor.h */,
E267FD591BE804E200F86B42 /* XLFormRowDescriptor.m */,
E267FD5A1BE804E200F86B42 /* XLFormSectionDescriptor.h */,
E267FD5B1BE804E200F86B42 /* XLFormSectionDescriptor.m */,
9C26955F2513D0230059594E /* XLFormDescriptor.h */,
9C26955D2513D0230059594E /* XLFormDescriptor.m */,
9C2695592513D0230059594E /* XLFormDescriptorDelegate.h */,
9C26955C2513D0230059594E /* XLFormRowDescriptor.h */,
9C26955A2513D0230059594E /* XLFormRowDescriptor.m */,
9C26955B2513D0230059594E /* XLFormSectionDescriptor.h */,
9C26955E2513D0230059594E /* XLFormSectionDescriptor.m */,
);
name = Descriptors;
path = XL/Descriptors;
sourceTree = "<group>";
};
E267FD5C1BE804E200F86B42 /* Helpers */ = {
isa = PBXGroup;
children = (
E267FD5D1BE804E200F86B42 /* NSArray+XLFormAdditions.h */,
E267FD5E1BE804E200F86B42 /* NSArray+XLFormAdditions.m */,
E267FD5F1BE804E200F86B42 /* NSExpression+XLFormAdditions.h */,
E267FD601BE804E200F86B42 /* NSExpression+XLFormAdditions.m */,
E267FD611BE804E200F86B42 /* NSObject+XLFormAdditions.h */,
E267FD621BE804E200F86B42 /* NSObject+XLFormAdditions.m */,
E267FD631BE804E200F86B42 /* NSPredicate+XLFormAdditions.h */,
E267FD641BE804E200F86B42 /* NSPredicate+XLFormAdditions.m */,
E267FD651BE804E200F86B42 /* NSString+XLFormAdditions.h */,
E267FD661BE804E200F86B42 /* NSString+XLFormAdditions.m */,
E267FD671BE804E200F86B42 /* UIView+XLFormAdditions.h */,
E267FD681BE804E200F86B42 /* UIView+XLFormAdditions.m */,
9C2695672513D0510059594E /* NSArray+XLFormAdditions.h */,
9C26956D2513D0510059594E /* NSArray+XLFormAdditions.m */,
9C2695692513D0510059594E /* NSExpression+XLFormAdditions.h */,
9C26956E2513D0510059594E /* NSExpression+XLFormAdditions.m */,
9C26956A2513D0510059594E /* NSObject+XLFormAdditions.h */,
9C2695712513D0510059594E /* NSObject+XLFormAdditions.m */,
9C26956B2513D0510059594E /* NSPredicate+XLFormAdditions.h */,
9C26956F2513D0510059594E /* NSPredicate+XLFormAdditions.m */,
9C2695722513D0520059594E /* NSString+XLFormAdditions.h */,
9C2695682513D0510059594E /* NSString+XLFormAdditions.m */,
9C2695702513D0510059594E /* UIView+XLFormAdditions.h */,
9C26956C2513D0510059594E /* UIView+XLFormAdditions.m */,
E267FD691BE804E200F86B42 /* Views */,
);
name = Helpers;
path = XL/Helpers;
sourceTree = "<group>";
};
E267FD691BE804E200F86B42 /* Views */ = {
isa = PBXGroup;
children = (
E267FD6A1BE804E200F86B42 /* XLFormRightDetailCell.h */,
E267FD6B1BE804E200F86B42 /* XLFormRightDetailCell.m */,
E267FD6C1BE804E200F86B42 /* XLFormRightImageButton.h */,
E267FD6D1BE804E200F86B42 /* XLFormRightImageButton.m */,
E267FD6E1BE804E200F86B42 /* XLFormRowNavigationAccessoryView.h */,
E267FD6F1BE804E200F86B42 /* XLFormRowNavigationAccessoryView.m */,
E267FD701BE804E200F86B42 /* XLFormTextView.h */,
E267FD711BE804E200F86B42 /* XLFormTextView.m */,
9C2695802513D0950059594E /* XLFormRightDetailCell.h */,
9C2695862513D0960059594E /* XLFormRightDetailCell.m */,
9C26957F2513D0950059594E /* XLFormRightImageButton.h */,
9C2695852513D0950059594E /* XLFormRightImageButton.m */,
9C2695842513D0950059594E /* XLFormRowNavigationAccessoryView.h */,
9C2695822513D0950059594E /* XLFormRowNavigationAccessoryView.m */,
9C2695812513D0950059594E /* XLFormTextView.h */,
9C2695832513D0950059594E /* XLFormTextView.m */,
);
path = Views;
name = Views;
sourceTree = "<group>";
};
E267FD721BE804E200F86B42 /* Validation */ = {
isa = PBXGroup;
children = (
E267FD731BE804E200F86B42 /* XLFormRegexValidator.h */,
E267FD741BE804E200F86B42 /* XLFormRegexValidator.m */,
E267FD751BE804E200F86B42 /* XLFormValidationStatus.h */,
E267FD761BE804E200F86B42 /* XLFormValidationStatus.m */,
E267FD771BE804E200F86B42 /* XLFormValidator.h */,
E267FD781BE804E200F86B42 /* XLFormValidator.m */,
E267FD791BE804E200F86B42 /* XLFormValidatorProtocol.h */,
9C2695922513D0CF0059594E /* XLFormRegexValidator.h */,
9C2695932513D0D00059594E /* XLFormRegexValidator.m */,
9C26958F2513D0CF0059594E /* XLFormValidationStatus.h */,
9C2695902513D0CF0059594E /* XLFormValidationStatus.m */,
9C2695912513D0CF0059594E /* XLFormValidator.h */,
9C2695952513D0D00059594E /* XLFormValidator.m */,
9C2695942513D0D00059594E /* XLFormValidatorProtocol.h */,
);
name = Validation;
path = XL/Validation;
sourceTree = "<group>";
};
/* End PBXGroup section */
@@ -343,47 +338,47 @@
isa = PBXHeadersBuildPhase;
buildActionMask = 2147483647;
files = (
E267FD881BE804E200F86B42 /* XLFormInlineSelectorCell.h in Headers */,
E267FD871BE804E200F86B42 /* XLFormInlineRowDescriptorCell.h in Headers */,
E267FDA11BE804E200F86B42 /* XLFormViewController.h in Headers */,
E267FD9C1BE804E200F86B42 /* XLFormOptionsObject.h in Headers */,
E267FD7E1BE804E200F86B42 /* XLFormButtonCell.h in Headers */,
E267FD841BE804E200F86B42 /* XLFormDatePickerCell.h in Headers */,
E267FD961BE804E200F86B42 /* XLFormSwitchCell.h in Headers */,
E267FDA61BE804E200F86B42 /* XLFormRowDescriptor.h in Headers */,
E267FD901BE804E200F86B42 /* XLFormSelectorCell.h in Headers */,
E267FDA81BE804E200F86B42 /* XLFormSectionDescriptor.h in Headers */,
E267FDAE1BE804E200F86B42 /* NSObject+XLFormAdditions.h in Headers */,
E267FD9E1BE804E200F86B42 /* XLFormOptionsViewController.h in Headers */,
E267FD821BE804E200F86B42 /* XLFormDateCell.h in Headers */,
E267FD801BE804E200F86B42 /* XLFormCheckCell.h in Headers */,
E267FD8E1BE804E200F86B42 /* XLFormSegmentedCell.h in Headers */,
E267FD8A1BE804E200F86B42 /* XLFormLeftRightSelectorCell.h in Headers */,
E267FD921BE804E200F86B42 /* XLFormSliderCell.h in Headers */,
E267FD941BE804E200F86B42 /* XLFormStepCounterCell.h in Headers */,
E267FDBA1BE804E200F86B42 /* XLFormRowNavigationAccessoryView.h in Headers */,
E267FDAA1BE804E200F86B42 /* NSArray+XLFormAdditions.h in Headers */,
E267FDB21BE804E200F86B42 /* NSString+XLFormAdditions.h in Headers */,
E267FDB81BE804E200F86B42 /* XLFormRightImageButton.h in Headers */,
E267FDA51BE804E200F86B42 /* XLFormDescriptorDelegate.h in Headers */,
E267FDC41BE804E200F86B42 /* XLFormValidatorProtocol.h in Headers */,
E267FDC21BE804E200F86B42 /* XLFormValidator.h in Headers */,
E267FDAC1BE804E200F86B42 /* NSExpression+XLFormAdditions.h in Headers */,
E267FDB61BE804E200F86B42 /* XLFormRightDetailCell.h in Headers */,
E267FDB01BE804E200F86B42 /* NSPredicate+XLFormAdditions.h in Headers */,
E267FDBC1BE804E200F86B42 /* XLFormTextView.h in Headers */,
E267FDC01BE804E200F86B42 /* XLFormValidationStatus.h in Headers */,
E267FDB41BE804E200F86B42 /* UIView+XLFormAdditions.h in Headers */,
E267FD8C1BE804E200F86B42 /* XLFormPickerCell.h in Headers */,
E267FDBE1BE804E200F86B42 /* XLFormRegexValidator.h in Headers */,
E267FD9A1BE804E200F86B42 /* XLFormTextViewCell.h in Headers */,
9C2695202513CEFF0059594E /* XLFormCheckCell.h in Headers */,
9C26952A2513CEFF0059594E /* XLFormDateCell.h in Headers */,
9C2695602513D0230059594E /* XLFormDescriptorDelegate.h in Headers */,
9C2695962513D0D00059594E /* XLFormValidationStatus.h in Headers */,
9C2695562513CFF50059594E /* XLFormOptionsViewController.h in Headers */,
9C2695522513CFF50059594E /* XLFormViewController.h in Headers */,
9C2695192513CEFF0059594E /* XLFormBaseCell.h in Headers */,
9C2695542513CFF50059594E /* XLFormRowDescriptorViewController.h in Headers */,
9C2695772513D0520059594E /* NSPredicate+XLFormAdditions.h in Headers */,
9C2695992513D0D00059594E /* XLFormRegexValidator.h in Headers */,
9C2695242513CEFF0059594E /* XLFormInlineRowDescriptorCell.h in Headers */,
9C26957E2513D0520059594E /* NSString+XLFormAdditions.h in Headers */,
9C26957C2513D0520059594E /* UIView+XLFormAdditions.h in Headers */,
9C2695222513CEFF0059594E /* XLFormLeftRightSelectorCell.h in Headers */,
9C2695632513D0230059594E /* XLFormRowDescriptor.h in Headers */,
9C2695282513CEFF0059594E /* XLFormDescriptorCell.h in Headers */,
9C2695622513D0230059594E /* XLFormSectionDescriptor.h in Headers */,
9C2695572513CFF50059594E /* XLFormOptionsObject.h in Headers */,
9C2695432513CFA70059594E /* XLFormSliderCell.h in Headers */,
9C2695482513CFA70059594E /* XLFormSwitchCell.h in Headers */,
9C2695412513CFA70059594E /* XLFormStepCounterCell.h in Headers */,
9C2695422513CFA70059594E /* XLFormTextFieldCell.h in Headers */,
9C2695892513D0960059594E /* XLFormTextView.h in Headers */,
9C26951C2513CEFF0059594E /* XLFormButtonCell.h in Headers */,
9C26959B2513D0D00059594E /* XLFormValidatorProtocol.h in Headers */,
9C2695752513D0520059594E /* NSExpression+XLFormAdditions.h in Headers */,
9C2695872513D0960059594E /* XLFormRightImageButton.h in Headers */,
9C2695442513CFA70059594E /* XLFormTextViewCell.h in Headers */,
9C2695762513D0520059594E /* NSObject+XLFormAdditions.h in Headers */,
9C26954A2513CFA70059594E /* XLFormSelectorCell.h in Headers */,
9C2695982513D0D00059594E /* XLFormValidator.h in Headers */,
E267FDC51BE804E200F86B42 /* XLForm.h in Headers */,
E267FDA31BE804E200F86B42 /* XLFormDescriptor.h in Headers */,
E267FD981BE804E200F86B42 /* XLFormTextFieldCell.h in Headers */,
E267FD7C1BE804E200F86B42 /* XLFormBaseCell.h in Headers */,
E267FD861BE804E200F86B42 /* XLFormDescriptorCell.h in Headers */,
6442F6501C1FC3AA00C9152F /* XLFormImageCell.h in Headers */,
E267FDA01BE804E200F86B42 /* XLFormRowDescriptorViewController.h in Headers */,
9C26958C2513D0960059594E /* XLFormRowNavigationAccessoryView.h in Headers */,
9C2695662513D0230059594E /* XLFormDescriptor.h in Headers */,
9C2695882513D0960059594E /* XLFormRightDetailCell.h in Headers */,
9C26951E2513CEFF0059594E /* XLFormInlineSelectorCell.h in Headers */,
9C2695732513D0520059594E /* NSArray+XLFormAdditions.h in Headers */,
9C2695212513CEFF0059594E /* XLFormImageCell.h in Headers */,
9C26951B2513CEFF0059594E /* XLFormDatePickerCell.h in Headers */,
9C2695462513CFA70059594E /* XLFormPickerCell.h in Headers */,
9C2695492513CFA70059594E /* XLFormSegmentedCell.h in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -414,11 +409,12 @@
E267FD171BE8048900F86B42 /* Project object */ = {
isa = PBXProject;
attributes = {
LastUpgradeCheck = 0710;
LastUpgradeCheck = 0940;
ORGANIZATIONNAME = XLForm;
TargetAttributes = {
E267FD1F1BE8048900F86B42 = {
CreatedOnToolsVersion = 7.1;
LastSwiftMigration = 1170;
};
};
};
@@ -427,6 +423,7 @@
developmentRegion = English;
hasScannedForEncodings = 0;
knownRegions = (
English,
en,
);
mainGroup = E267FD161BE8048900F86B42;
@@ -455,42 +452,42 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
E267FDB51BE804E200F86B42 /* UIView+XLFormAdditions.m in Sources */,
E267FDC11BE804E200F86B42 /* XLFormValidationStatus.m in Sources */,
E267FDBD1BE804E200F86B42 /* XLFormTextView.m in Sources */,
E267FDB91BE804E200F86B42 /* XLFormRightImageButton.m in Sources */,
E267FDAB1BE804E200F86B42 /* NSArray+XLFormAdditions.m in Sources */,
E267FD811BE804E200F86B42 /* XLFormCheckCell.m in Sources */,
E267FDB71BE804E200F86B42 /* XLFormRightDetailCell.m in Sources */,
E267FD831BE804E200F86B42 /* XLFormDateCell.m in Sources */,
E267FD9B1BE804E200F86B42 /* XLFormTextViewCell.m in Sources */,
E267FD8F1BE804E200F86B42 /* XLFormSegmentedCell.m in Sources */,
E267FDAD1BE804E200F86B42 /* NSExpression+XLFormAdditions.m in Sources */,
E267FDBF1BE804E200F86B42 /* XLFormRegexValidator.m in Sources */,
E267FDC31BE804E200F86B42 /* XLFormValidator.m in Sources */,
E267FD931BE804E200F86B42 /* XLFormSliderCell.m in Sources */,
E267FDB11BE804E200F86B42 /* NSPredicate+XLFormAdditions.m in Sources */,
E267FDA41BE804E200F86B42 /* XLFormDescriptor.m in Sources */,
E267FD8B1BE804E200F86B42 /* XLFormLeftRightSelectorCell.m in Sources */,
E267FD9F1BE804E200F86B42 /* XLFormOptionsViewController.m in Sources */,
E267FD8D1BE804E200F86B42 /* XLFormPickerCell.m in Sources */,
E267FD951BE804E200F86B42 /* XLFormStepCounterCell.m in Sources */,
E267FDBB1BE804E200F86B42 /* XLFormRowNavigationAccessoryView.m in Sources */,
E267FD7D1BE804E200F86B42 /* XLFormBaseCell.m in Sources */,
E267FDA21BE804E200F86B42 /* XLFormViewController.m in Sources */,
E267FDB31BE804E200F86B42 /* NSString+XLFormAdditions.m in Sources */,
E267FD851BE804E200F86B42 /* XLFormDatePickerCell.m in Sources */,
E267FDAF1BE804E200F86B42 /* NSObject+XLFormAdditions.m in Sources */,
E267FD991BE804E200F86B42 /* XLFormTextFieldCell.m in Sources */,
E267FD9D1BE804E200F86B42 /* XLFormOptionsObject.m in Sources */,
E267FD7F1BE804E200F86B42 /* XLFormButtonCell.m in Sources */,
E267FD911BE804E200F86B42 /* XLFormSelectorCell.m in Sources */,
E267FDA91BE804E200F86B42 /* XLFormSectionDescriptor.m in Sources */,
6442F6511C1FC3AA00C9152F /* XLFormImageCell.m in Sources */,
E267FD971BE804E200F86B42 /* XLFormSwitchCell.m in Sources */,
9C2695782513D0520059594E /* UIView+XLFormAdditions.m in Sources */,
9C26953C2513CFA70059594E /* XLFormPickerCell.m in Sources */,
9C2695612513D0230059594E /* XLFormRowDescriptor.m in Sources */,
9C26953E2513CFA70059594E /* XLFormSelectorCell.m in Sources */,
9C26959C2513D0D00059594E /* XLFormValidator.m in Sources */,
9C2695402513CFA70059594E /* XLFormTextFieldCell.m in Sources */,
9C26959A2513D0D00059594E /* XLFormRegexValidator.m in Sources */,
9C26957A2513D0520059594E /* NSExpression+XLFormAdditions.m in Sources */,
9C26953F2513CFA70059594E /* XLFormTextViewCell.m in Sources */,
9C2695262513CEFF0059594E /* XLFormInlineSelectorCell.m in Sources */,
9C2695552513CFF50059594E /* XLFormOptionsObject.m in Sources */,
9C2695452513CFA70059594E /* XLFormSegmentedCell.m in Sources */,
9C2695972513D0D00059594E /* XLFormValidationStatus.m in Sources */,
9C2695582513CFF50059594E /* XLFormOptionsViewController.m in Sources */,
9C26951D2513CEFF0059594E /* XLFormButtonCell.m in Sources */,
9C26957B2513D0520059594E /* NSPredicate+XLFormAdditions.m in Sources */,
9C26951F2513CEFF0059594E /* XLFormDatePickerCell.m in Sources */,
9C2695472513CFA70059594E /* XLFormSwitchCell.m in Sources */,
9C26958B2513D0960059594E /* XLFormTextView.m in Sources */,
9C2695642513D0230059594E /* XLFormDescriptor.m in Sources */,
9C26953D2513CFA70059594E /* XLFormSliderCell.m in Sources */,
9C2695742513D0520059594E /* NSString+XLFormAdditions.m in Sources */,
9C2695232513CEFF0059594E /* XLFormLeftRightSelectorCell.m in Sources */,
9C26958D2513D0960059594E /* XLFormRightImageButton.m in Sources */,
9C26958A2513D0960059594E /* XLFormRowNavigationAccessoryView.m in Sources */,
9C26953B2513CFA70059594E /* XLFormStepCounterCell.m in Sources */,
9C2695532513CFF50059594E /* XLFormViewController.m in Sources */,
9C26951A2513CEFF0059594E /* XLFormCheckCell.m in Sources */,
9C2695292513CEFF0059594E /* XLFormImageCell.m in Sources */,
9C2695272513CEFF0059594E /* XLFormBaseCell.m in Sources */,
9C2695252513CEFF0059594E /* XLFormDateCell.m in Sources */,
9C26958E2513D0960059594E /* XLFormRightDetailCell.m in Sources */,
9C2695652513D0230059594E /* XLFormSectionDescriptor.m in Sources */,
9C26957D2513D0520059594E /* NSObject+XLFormAdditions.m in Sources */,
9C2695792513D0520059594E /* NSArray+XLFormAdditions.m in Sources */,
E267FDC61BE804E200F86B42 /* XLForm.m in Sources */,
E267FD891BE804E200F86B42 /* XLFormInlineSelectorCell.m in Sources */,
E267FDA71BE804E200F86B42 /* XLFormRowDescriptor.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -505,13 +502,23 @@
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
@@ -520,6 +527,7 @@
DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
"EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
@@ -534,7 +542,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
@@ -552,13 +560,23 @@
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
@@ -567,6 +585,7 @@
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
"EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
@@ -575,7 +594,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
@@ -588,6 +607,9 @@
E267FD291BE8048900F86B42 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
CLANG_ENABLE_MODULES = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
CURRENT_PROJECT_VERSION = 1;
DEFINES_MODULE = YES;
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
@@ -595,15 +617,21 @@
INFOPLIST_FILE = XLForm/Info.plist;
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
MARKETING_VERSION = 4.3.0;
PRODUCT_BUNDLE_IDENTIFIER = com.xmartlabs.XLForm;
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
};
name = Debug;
};
E267FD2A1BE8048900F86B42 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
CLANG_ENABLE_MODULES = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
CURRENT_PROJECT_VERSION = 1;
DEFINES_MODULE = YES;
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
@@ -611,9 +639,11 @@
INFOPLIST_FILE = XLForm/Info.plist;
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
MARKETING_VERSION = 4.3.0;
PRODUCT_BUNDLE_IDENTIFIER = com.xmartlabs.XLForm;
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
SWIFT_VERSION = 5.0;
};
name = Release;
};
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IDEDidComputeMac32BitWarning</key>
<true/>
</dict>
</plist>
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0710"
LastUpgradeVersion = "0940"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
+1 -1
View File
@@ -15,7 +15,7 @@
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<string>$(MARKETING_VERSION)</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
@@ -28,7 +28,7 @@
@interface UIView (XLFormAdditions)
+(id)autolayoutView;
+(instancetype)autolayoutView;
-(NSLayoutConstraint *)layoutConstraintSameHeightOf:(UIView *)view;
-(UIView *)findFirstResponder;
-(UITableViewCell<XLFormDescriptorCell> *)formDescriptorCell;
@@ -27,47 +27,62 @@
@implementation UIView (XLFormAdditions)
+ (id)autolayoutView
+ (instancetype)autolayoutView
{
UIView *view = [self new];
__kindof UIView *view = [self new];
view.translatesAutoresizingMaskIntoConstraints = NO;
return view;
}
-(NSLayoutConstraint *)layoutConstraintSameHeightOf:(UIView *)view
- (NSLayoutConstraint *)layoutConstraintSameHeightOf:(UIView *)view
{
return [NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:view attribute:NSLayoutAttributeHeight multiplier:1.0f constant:0.0f];
return [NSLayoutConstraint constraintWithItem:self
attribute:NSLayoutAttributeHeight
relatedBy:NSLayoutRelationEqual
toItem:view
attribute:NSLayoutAttributeHeight
multiplier:1.0
constant:0.0];
}
- (UIView *)findFirstResponder
{
UIView *firstResponder = nil;
if (self.isFirstResponder) {
return self;
firstResponder = self;
}
for (UIView *subView in self.subviews) {
UIView *firstResponder = [subView findFirstResponder];
if (firstResponder != nil) {
return firstResponder;
else {
for (UIView *subView in self.subviews) {
UIView *fr = [subView findFirstResponder];
if (fr != nil) {
firstResponder = fr;
break;
}
}
}
return nil;
return firstResponder;
}
- (UITableViewCell<XLFormDescriptorCell> *)formDescriptorCell
{
UITableViewCell<XLFormDescriptorCell> * tableViewCell = nil;
if ([self isKindOfClass:[UITableViewCell class]]) {
if ([self conformsToProtocol:@protocol(XLFormDescriptorCell)]){
return (UITableViewCell<XLFormDescriptorCell> *)self;
}
return nil;
}
if (self.superview) {
UITableViewCell<XLFormDescriptorCell> * tableViewCell = [self.superview formDescriptorCell];
if (tableViewCell != nil) {
return tableViewCell;
tableViewCell = (UITableViewCell<XLFormDescriptorCell> *)self;
}
}
return nil;
else if (self.superview) {
UITableViewCell<XLFormDescriptorCell> * cell = [self.superview formDescriptorCell];
if (cell != nil) {
tableViewCell = cell;
}
}
return tableViewCell;
}
@end
@@ -42,8 +42,8 @@
@protocol XLFormReturnKeyProtocol
@property UIReturnKeyType returnKeyType;
@property UIReturnKeyType nextReturnKeyType;
@property (nonatomic, assign) UIReturnKeyType returnKeyType;
@property (nonatomic, assign) UIReturnKeyType nextReturnKeyType;
@end
+26 -1
View File
@@ -50,7 +50,32 @@
{
self.textLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleBody];
self.detailTextLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleBody];
self.textLabel.textColor = self.rowDescriptor.isDisabled ? [UIColor grayColor] : [UIColor blackColor];
UIColor * textColor = nil;
UIColor * disabledTextColor = nil;
if (@available(iOS 13.0, *)) {
textColor = [UIColor labelColor];
disabledTextColor = [UIColor systemGray3Color];
}
else if (@available(iOS 12.0, *)) {
textColor = [self traitCollection].userInterfaceStyle == UIUserInterfaceStyleDark ? [UIColor lightTextColor] : [UIColor darkTextColor];
disabledTextColor = [UIColor systemGrayColor];
}
else {
textColor = [UIColor blackColor];
disabledTextColor = [UIColor grayColor];
}
if (self.rowDescriptor.isDisabled) {
self.textLabel.textColor = disabledTextColor;
}
else {
self.textLabel.textColor = textColor;
}
}
-(void)highlight
+13 -3
View File
@@ -26,14 +26,24 @@
#import "XLFormRowDescriptor.h"
#import "XLFormButtonCell.h"
@interface XLFormButtonCell ()
@property(nonatomic) BOOL useTintColor;
@end
@implementation XLFormButtonCell
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
return [super initWithStyle:style reuseIdentifier:reuseIdentifier];
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
_useTintColor = YES;
}
return self;
}
#pragma mark - XLFormDescriptorCell
-(void)configure
@@ -52,7 +62,7 @@
self.editingAccessoryType = self.accessoryType;
self.selectionStyle = isDisabled ? UITableViewCellSelectionStyleNone : UITableViewCellSelectionStyleDefault;
if (simpleAction){
if (simpleAction && _useTintColor){
CGFloat red, green, blue, alpha;
[self.tintColor getRed:&red green:&green blue:&blue alpha:&alpha];
self.textLabel.textColor = [UIColor colorWithRed:red green:green blue:blue alpha:(isDisabled ? 0.3 : 1.0)];
@@ -32,12 +32,20 @@ typedef NS_ENUM(NSUInteger, XLFormDateDatePickerMode) {
XLFormDateDatePickerModeTime
};
typedef NS_ENUM(NSUInteger, XLFormDateDatePickerStyle) {
XLFormDateDatePickerStyleAutomatic,
XLFormDateDatePickerStyleCompact,
XLFormDateDatePickerStyleInline,
XLFormDateDatePickerStyleWheels
};
@interface XLFormDateCell : XLFormBaseCell
@property (nonatomic) XLFormDateDatePickerMode formDatePickerMode;
@property (nonatomic) NSDate *minimumDate;
@property (nonatomic) NSDate *maximumDate;
@property (nonatomic) NSInteger minuteInterval;
@property (nonatomic) NSLocale *locale;
@property (nonatomic, assign) XLFormDateDatePickerMode formDatePickerMode;
@property (nonatomic, assign) XLFormDateDatePickerStyle formDatePickerStyle;
@property (nonatomic, copy ) NSDate *minimumDate;
@property (nonatomic, copy ) NSDate *maximumDate;
@property (nonatomic, assign) NSInteger minuteInterval;
@property (nonatomic, copy ) NSLocale *locale;
@end
@@ -48,6 +48,7 @@
[self.datePicker setDate:self.rowDescriptor.value animated:[self.rowDescriptor.rowType isEqualToString:XLFormRowDescriptorTypeCountDownTimer]];
}
[self setModeToDatePicker:self.datePicker];
[self setStyleToDatePicker:self.datePicker];
return self.datePicker;
}
return [super inputView];
@@ -74,6 +75,7 @@
XLFormRowDescriptor * datePickerRowDescriptor = [XLFormRowDescriptor formRowDescriptorWithTag:nil rowType:XLFormRowDescriptorTypeDatePicker];
XLFormDatePickerCell * datePickerCell = (XLFormDatePickerCell *)[datePickerRowDescriptor cellForFormController:self.formViewController];
[self setModeToDatePicker:datePickerCell.datePicker];
[self setStyleToDatePicker:datePickerCell.datePicker];
if (self.rowDescriptor.value){
[datePickerCell.datePicker setDate:self.rowDescriptor.value animated:[self.rowDescriptor.rowType isEqualToString:XLFormRowDescriptorTypeCountDownTimerInline]];
}
@@ -225,6 +227,26 @@
}
}
-(void)setStyleToDatePicker:(UIDatePicker *)datePicker
{
if (@available(iOS 14.0, *)) {
switch (self.formDatePickerStyle) {
case XLFormDateDatePickerStyleInline:
datePicker.preferredDatePickerStyle = UIDatePickerStyleInline;
break;
case XLFormDateDatePickerStyleCompact:
datePicker.preferredDatePickerStyle = UIDatePickerStyleCompact;
break;
case XLFormDateDatePickerStyleWheels:
datePicker.preferredDatePickerStyle = UIDatePickerStyleWheels;
break;
default:
datePicker.preferredDatePickerStyle = UIDatePickerStyleAutomatic;
break;
}
}
}
#pragma mark - Properties
-(UIDatePicker *)datePicker
@@ -232,6 +254,7 @@
if (_datePicker) return _datePicker;
_datePicker = [[UIDatePicker alloc] init];
[self setModeToDatePicker:_datePicker];
[self setStyleToDatePicker:_datePicker];
[_datePicker addTarget:self action:@selector(datePickerValueChanged:) forControlEvents:UIControlEventValueChanged];
return _datePicker;
}
@@ -262,6 +285,7 @@
if ([nextFormRow.rowType isEqualToString:XLFormRowDescriptorTypeDatePicker]){
XLFormDatePickerCell * datePickerCell = (XLFormDatePickerCell *)[nextFormRow cellForFormController:self.formViewController];
[self setModeToDatePicker:datePickerCell.datePicker];
[self setStyleToDatePicker:datePickerCell.datePicker];
}
}
}
@@ -37,16 +37,6 @@
return YES;
}
#pragma mark - Properties
-(UIDatePicker *)datePicker
{
if (_datePicker) return _datePicker;
_datePicker = [UIDatePicker autolayoutView];
[_datePicker addTarget:self action:@selector(datePickerValueChanged:) forControlEvents:UIControlEventValueChanged];
return _datePicker;
}
#pragma mark- Target Action
- (void)datePickerValueChanged:(UIDatePicker *)sender
@@ -66,7 +56,12 @@
-(void)configure
{
[super configure];
[self.contentView addSubview:self.datePicker];
UIDatePicker *datePicker = [UIDatePicker autolayoutView];
[datePicker addTarget:self action:@selector(datePickerValueChanged:) forControlEvents:UIControlEventValueChanged];
[self.contentView addSubview:datePicker];
_datePicker = datePicker;
[self.contentView addConstraint:[NSLayoutConstraint constraintWithItem:self.datePicker attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self.contentView attribute:NSLayoutAttributeCenterX multiplier:1 constant:0]];
[self.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-0-[datePicker]-0-|" options:0 metrics:0 views:@{@"datePicker" : self.datePicker}]];
}
@@ -49,15 +49,15 @@ typedef NS_OPTIONS(NSUInteger, XLFormRowNavigationOptions) {
@interface XLFormDescriptor : NSObject
@property (readonly, nonatomic, nonnull) NSMutableArray * formSections;
@property (readonly, nullable) NSString * title;
@property (nonatomic) BOOL endEditingTableViewOnScroll;
@property (nonatomic) BOOL assignFirstResponderOnShow;
@property (nonatomic) BOOL addAsteriskToRequiredRowsTitle;
@property (getter=isDisabled) BOOL disabled;
@property (nonatomic) XLFormRowNavigationOptions rowNavigationOptions;
@property (nonatomic, strong, readonly, nonnull) NSMutableArray * formSections;
@property (nonatomic, readonly, nullable, copy) NSString * title;
@property (nonatomic, assign) BOOL endEditingTableViewOnScroll;
@property (nonatomic, assign) BOOL assignFirstResponderOnShow;
@property (nonatomic, assign) BOOL addAsteriskToRequiredRowsTitle;
@property (nonatomic, getter=isDisabled, assign) BOOL disabled;
@property (nonatomic, assign) XLFormRowNavigationOptions rowNavigationOptions;
@property (weak, nullable) id<XLFormDescriptorDelegate> delegate;
@property (nonatomic, weak, nullable) id<XLFormDescriptorDelegate> delegate;
+(nonnull instancetype)formDescriptor;
+(nonnull instancetype)formDescriptorWithTitle:(nullable NSString *)title;
@@ -32,10 +32,13 @@
NSString * const XLFormErrorDomain = @"XLFormErrorDomain";
NSString * const XLValidationStatusErrorKey = @"XLValidationStatusErrorKey";
NSString * const XLFormSectionsKey = @"formSections";
@interface XLFormSectionDescriptor (_XLFormDescriptor)
@property NSArray * allRows;
@property (nonatomic, weak) NSArray *allRows;
-(BOOL)evaluateIsHidden;
@end
@@ -51,11 +54,11 @@ NSString * const XLValidationStatusErrorKey = @"XLValidationStatusErrorKey";
@interface XLFormDescriptor()
@property NSMutableArray * formSections;
@property (readonly) NSMutableArray * allSections;
@property NSString * title;
@property (readonly) NSMutableDictionary* allRowsByTag;
@property NSMutableDictionary* rowObservers;
@property (nonatomic, strong) NSMutableArray *formSections;
@property (nonatomic, strong, readonly) NSMutableArray *allSections;
@property (nonatomic, copy ) NSString *title;
@property (nonatomic, strong, readonly) NSMutableDictionary *allRowsByTag;
@property (atomic , strong) NSMutableDictionary *rowObservers;
@end
@@ -63,15 +66,14 @@ NSString * const XLValidationStatusErrorKey = @"XLValidationStatusErrorKey";
-(instancetype)init
{
return [self initWithTitle:nil];
return [self initWithTitle:@""];
}
-(instancetype)initWithTitle:(NSString *)title;
{
self = [super init];
if (self){
if (self = [super init]) {
_formSections = [NSMutableArray array];
_allSections = [NSMutableArray array];
_allSections = [NSMutableArray array];
_allRowsByTag = [NSMutableDictionary dictionary];
_rowObservers = [NSMutableDictionary dictionary];
_title = title;
@@ -79,14 +81,19 @@ NSString * const XLValidationStatusErrorKey = @"XLValidationStatusErrorKey";
_disabled = NO;
_endEditingTableViewOnScroll = YES;
_rowNavigationOptions = XLFormRowNavigationOptionEnabled;
[self addObserver:self forKeyPath:@"formSections" options:(NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld) context:0];
[self addObserver:self
forKeyPath:XLFormSectionsKey
options:(NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld)
context:0];
}
return self;
}
+(instancetype)formDescriptor
{
return [[self class] formDescriptorWithTitle:nil];
return [[self class] formDescriptorWithTitle:@""];
}
+(instancetype)formDescriptorWithTitle:(NSString *)title
@@ -101,11 +108,11 @@ NSString * const XLValidationStatusErrorKey = @"XLValidationStatusErrorKey";
-(void)addFormSection:(XLFormSectionDescriptor *)formSection atIndex:(NSUInteger)index
{
if (index == 0){
if (index == 0) {
[self insertObject:formSection inAllSectionsAtIndex:0];
}
else{
XLFormSectionDescriptor* previousSection = [self.formSections objectAtIndex:MIN(self.formSections.count, index-1)];
else {
XLFormSectionDescriptor *previousSection = [self.formSections objectAtIndex:MIN(self.formSections.count, index-1)];
[self addFormSection:formSection afterSection:previousSection];
}
}
@@ -114,26 +121,28 @@ NSString * const XLValidationStatusErrorKey = @"XLValidationStatusErrorKey";
{
NSUInteger sectionIndex;
NSUInteger allSectionIndex;
if ((sectionIndex = [self.allSections indexOfObject:formSection]) == NSNotFound){
if ((sectionIndex = [self.allSections indexOfObject:formSection]) == NSNotFound) {
allSectionIndex = [self.allSections indexOfObject:afterSection];
if (allSectionIndex != NSNotFound) {
[self insertObject:formSection inAllSectionsAtIndex:(allSectionIndex + 1)];
}
else { //case when afterSection does not exist. Just insert at the end.
[self addFormSection:formSection];
return;
}
}
formSection.hidden = formSection.hidden;
}
-(void)addFormRow:(XLFormRowDescriptor *)formRow beforeRow:(XLFormRowDescriptor *)beforeRow
{
if (beforeRow.sectionDescriptor){
if (beforeRow.sectionDescriptor) {
[beforeRow.sectionDescriptor addFormRow:formRow beforeRow:beforeRow];
}
else{
else {
[[self.allSections lastObject] addFormRow:formRow beforeRow:beforeRow];
}
}
@@ -144,27 +153,25 @@ NSString * const XLValidationStatusErrorKey = @"XLValidationStatusErrorKey";
[self addFormRow:formRow beforeRow:beforeRowForm];
}
-(void)addFormRow:(XLFormRowDescriptor *)formRow afterRow:(XLFormRowDescriptor *)afterRow
{
if (afterRow.sectionDescriptor){
if (afterRow.sectionDescriptor) {
[afterRow.sectionDescriptor addFormRow:formRow afterRow:afterRow];
}
else{
else {
[[self.allSections lastObject] addFormRow:formRow afterRow:afterRow];
}
}
-(void)addFormRow:(XLFormRowDescriptor *)formRow afterRowTag:(NSString *)afterRowTag
{
XLFormRowDescriptor * afterRowForm = [self formRowWithTag:afterRowTag];
XLFormRowDescriptor *afterRowForm = [self formRowWithTag:afterRowTag];
[self addFormRow:formRow afterRow:afterRowForm];
}
-(void)removeFormSectionAtIndex:(NSUInteger)index
{
if (self.formSections.count > index){
if (self.formSections.count > index) {
XLFormSectionDescriptor *formSection = [self.formSections objectAtIndex:index];
[self removeObjectFromFormSectionsAtIndex:index];
NSUInteger allSectionIndex = [self.allSections indexOfObject:formSection];
@@ -175,43 +182,47 @@ NSString * const XLValidationStatusErrorKey = @"XLValidationStatusErrorKey";
-(void)removeFormSection:(XLFormSectionDescriptor *)formSection
{
NSUInteger index = NSNotFound;
if ((index = [self.formSections indexOfObject:formSection]) != NSNotFound){
if ((index = [self.formSections indexOfObject:formSection]) != NSNotFound) {
[self removeFormSectionAtIndex:index];
}
else if ((index = [self.allSections indexOfObject:formSection]) != NSNotFound){
if ((index = [self.allSections indexOfObject:formSection]) != NSNotFound) {
[self removeObjectFromAllSectionsAtIndex:index];
};
}
}
-(void)removeFormRow:(XLFormRowDescriptor *)formRow
{
for (XLFormSectionDescriptor * section in self.formSections){
if ([section.formRows containsObject:formRow]){
for (XLFormSectionDescriptor *section in self.formSections) {
if ([section.formRows containsObject:formRow]) {
[section removeFormRow:formRow];
break;
}
}
}
-(void)showFormSection:(XLFormSectionDescriptor*)formSection
-(void)showFormSection:(XLFormSectionDescriptor *)formSection
{
NSUInteger formIndex = [self.formSections indexOfObject:formSection];
if (formIndex != NSNotFound) {
return;
}
NSUInteger index = [self.allSections indexOfObject:formSection];
if (index != NSNotFound){
if (index != NSNotFound) {
while (formIndex == NSNotFound && index > 0) {
XLFormSectionDescriptor* previous = [self.allSections objectAtIndex:--index];
formIndex = [self.formSections indexOfObject:previous];
}
[self insertObject:formSection inFormSectionsAtIndex:(formIndex == NSNotFound ? 0 : ++formIndex)];
}
}
-(void)hideFormSection:(XLFormSectionDescriptor*)formSection
-(void)hideFormSection:(XLFormSectionDescriptor *)formSection
{
NSUInteger index = [self.formSections indexOfObject:formSection];
if (index != NSNotFound){
if (index != NSNotFound) {
[self removeObjectFromFormSectionsAtIndex:index];
}
}
@@ -224,28 +235,29 @@ NSString * const XLValidationStatusErrorKey = @"XLValidationStatusErrorKey";
-(XLFormRowDescriptor *)formRowWithHash:(NSUInteger)hash
{
for (XLFormSectionDescriptor * section in self.allSections){
for (XLFormRowDescriptor * row in section.allRows) {
if ([row hash] == hash){
for (XLFormSectionDescriptor *section in self.allSections) {
for (XLFormRowDescriptor *row in section.allRows) {
if ([row hash] == hash) {
return row;
}
}
}
return nil;
}
-(void)removeFormRowWithTag:(NSString *)tag
{
XLFormRowDescriptor * formRow = [self formRowWithTag:tag];
XLFormRowDescriptor *formRow = [self formRowWithTag:tag];
[self removeFormRow:formRow];
}
-(XLFormRowDescriptor *)formRowAtIndex:(NSIndexPath *)indexPath
{
if ((self.formSections.count > indexPath.section) && [[self.formSections objectAtIndex:indexPath.section] formRows].count > indexPath.row){
if ((self.formSections.count > indexPath.section) && [[self.formSections objectAtIndex:indexPath.section] formRows].count > indexPath.row) {
return [[[self.formSections objectAtIndex:indexPath.section] formRows] objectAtIndex:indexPath.row];
}
return nil;
}
@@ -256,55 +268,62 @@ NSString * const XLValidationStatusErrorKey = @"XLValidationStatusErrorKey";
-(NSIndexPath *)indexPathOfFormRow:(XLFormRowDescriptor *)formRow
{
XLFormSectionDescriptor * section = formRow.sectionDescriptor;
if (section){
NSIndexPath *result = nil;
XLFormSectionDescriptor *section = formRow.sectionDescriptor;
if (section) {
NSUInteger sectionIndex = [self.formSections indexOfObject:section];
if (sectionIndex != NSNotFound){
if (sectionIndex != NSNotFound) {
NSUInteger rowIndex = [section.formRows indexOfObject:formRow];
if (rowIndex != NSNotFound){
return [NSIndexPath indexPathForRow:rowIndex inSection:sectionIndex];
if (rowIndex != NSNotFound) {
result = [NSIndexPath indexPathForRow:rowIndex inSection:sectionIndex];
}
}
}
return nil;
return result;
}
-(NSIndexPath *)globalIndexPathOfFormRow:(XLFormRowDescriptor *)formRow
{
XLFormSectionDescriptor * section = formRow.sectionDescriptor;
if (section){
NSIndexPath *result = nil;
XLFormSectionDescriptor *section = formRow.sectionDescriptor;
if (section) {
NSUInteger sectionIndex = [self.allSections indexOfObject:section];
if (sectionIndex != NSNotFound){
if (sectionIndex != NSNotFound) {
NSUInteger rowIndex = [section.allRows indexOfObject:formRow];
if (rowIndex != NSNotFound){
return [NSIndexPath indexPathForRow:rowIndex inSection:sectionIndex];
if (rowIndex != NSNotFound) {
result = [NSIndexPath indexPathForRow:rowIndex inSection:sectionIndex];
}
}
}
return nil;
return result;
}
-(NSDictionary *)formValues
{
NSMutableDictionary * result = [NSMutableDictionary dictionary];
for (XLFormSectionDescriptor * section in self.formSections) {
if (section.multivaluedTag.length > 0){
NSMutableArray * multiValuedValuesArray = [NSMutableArray new];
for (XLFormRowDescriptor * row in section.formRows) {
if (row.value){
NSMutableDictionary *result = [NSMutableDictionary dictionary];
for (XLFormSectionDescriptor *section in self.formSections) {
if (section.multivaluedTag.length > 0) {
NSMutableArray *multiValuedValuesArray = [NSMutableArray new];
for (XLFormRowDescriptor *row in section.formRows) {
if (row.value && row.value != [NSNull null]) {
[multiValuedValuesArray addObject:row.value];
}
}
[result setObject:multiValuedValuesArray forKey:section.multivaluedTag];
}
else{
for (XLFormRowDescriptor * row in section.formRows) {
if (row.tag.length > 0){
[result setObject:(row.value ?: [NSNull null]) forKey:row.tag];
else {
for (XLFormRowDescriptor *row in section.formRows) {
id value = [row.value valueData];
if (row.tag.length > 0 && value != nil) {
[result setObject:value forKey:row.tag];
}
}
}
}
return result;
}
@@ -312,49 +331,55 @@ NSString * const XLValidationStatusErrorKey = @"XLValidationStatusErrorKey";
{
NSMutableDictionary * result = [NSMutableDictionary dictionary];
for (XLFormSectionDescriptor * section in self.formSections) {
if (section.multivaluedTag.length > 0){
NSMutableArray * multiValuedValuesArray = [NSMutableArray new];
if (section.multivaluedTag.length > 0) {
NSMutableArray *multiValuedValuesArray = [NSMutableArray new];
for (XLFormRowDescriptor * row in section.formRows) {
if ([row.value valueData]){
if ([row.value valueData]) {
[multiValuedValuesArray addObject:[row.value valueData]];
}
}
[result setObject:multiValuedValuesArray forKey:section.multivaluedTag];
}
else{
else {
for (XLFormRowDescriptor * row in section.formRows) {
NSString * httpParameterKey = nil;
if ((httpParameterKey = [self httpParameterKeyForRow:row cell:[row cellForFormController:formViewController]])){
NSString *httpParameterKey = nil;
if ((httpParameterKey = [self httpParameterKeyForRow:row cell:[row cellForFormController:formViewController]])) {
id parameterValue = [row.value valueData] ?: [NSNull null];
[result setObject:parameterValue forKey:httpParameterKey];
}
}
}
}
return result;
}
-(NSString *)httpParameterKeyForRow:(XLFormRowDescriptor *)row cell:(UITableViewCell<XLFormDescriptorCell> *)descriptorCell
{
if ([descriptorCell respondsToSelector:@selector(formDescriptorHttpParameterName)]){
return [descriptorCell formDescriptorHttpParameterName];
NSString *result = nil;
if ([descriptorCell respondsToSelector:@selector(formDescriptorHttpParameterName)]) {
result = [descriptorCell formDescriptorHttpParameterName];
}
if (row.tag.length > 0){
return row.tag;
else if (row.tag.length > 0) {
result = row.tag;
}
return nil;
return result;
}
-(NSArray *)localValidationErrors:(XLFormViewController *)formViewController {
NSMutableArray * result = [NSMutableArray array];
for (XLFormSectionDescriptor * section in self.formSections) {
for (XLFormRowDescriptor * row in section.formRows) {
XLFormValidationStatus* status = [row doValidation];
-(NSArray *)localValidationErrors:(XLFormViewController *)formViewController
{
NSMutableArray *result = [NSMutableArray array];
for (XLFormSectionDescriptor *section in self.formSections) {
for (XLFormRowDescriptor *row in section.formRows) {
XLFormValidationStatus *status = [row doValidation];
if (status != nil && (![status isValid])) {
NSDictionary *userInfo = @{ NSLocalizedDescriptionKey: status.msg,
XLValidationStatusErrorKey: status };
NSError * error = [[NSError alloc] initWithDomain:XLFormErrorDomain code:XLFormErrorCodeGen userInfo:userInfo];
if (error){
NSError *error = [[NSError alloc] initWithDomain:XLFormErrorDomain code:XLFormErrorCodeGen userInfo:userInfo];
if (error) {
[result addObject:error];
}
}
@@ -367,11 +392,11 @@ NSString * const XLValidationStatusErrorKey = @"XLValidationStatusErrorKey";
- (void)setFirstResponder:(XLFormViewController *)formViewController
{
for (XLFormSectionDescriptor * formSection in self.formSections) {
for (XLFormRowDescriptor * row in formSection.formRows) {
UITableViewCell<XLFormDescriptorCell> * cell = [row cellForFormController:formViewController];
if ([cell formDescriptorCellCanBecomeFirstResponder]){
if ([cell formDescriptorCellBecomeFirstResponder]){
for (XLFormSectionDescriptor *formSection in self.formSections) {
for (XLFormRowDescriptor *row in formSection.formRows) {
UITableViewCell<XLFormDescriptorCell> *cell = [row cellForFormController:formViewController];
if ([cell formDescriptorCellCanBecomeFirstResponder]) {
if ([cell formDescriptorCellBecomeFirstResponder]) {
return;
}
}
@@ -382,18 +407,23 @@ NSString * const XLValidationStatusErrorKey = @"XLValidationStatusErrorKey";
#pragma mark - KVO
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
- (void)observeValueForKeyPath:(nullable NSString *)keyPath
ofObject:(nullable id)object
change:(nullable NSDictionary<NSKeyValueChangeKey, id> *)change
context:(nullable void *)context
{
if (!self.delegate) return;
if ([keyPath isEqualToString:@"formSections"]){
if ([[change objectForKey:NSKeyValueChangeKindKey] isEqualToNumber:@(NSKeyValueChangeInsertion)]){
NSIndexSet * indexSet = [change objectForKey:NSKeyValueChangeIndexesKey];
XLFormSectionDescriptor * section = [self.formSections objectAtIndex:indexSet.firstIndex];
if (!self.delegate) {
return;
}
else if ([keyPath isEqualToString:XLFormSectionsKey]) {
if ([[change objectForKey:NSKeyValueChangeKindKey] isEqualToNumber:@(NSKeyValueChangeInsertion)]) {
NSIndexSet *indexSet = [change objectForKey:NSKeyValueChangeIndexesKey];
XLFormSectionDescriptor *section = [self.formSections objectAtIndex:indexSet.firstIndex];
[self.delegate formSectionHasBeenAdded:section atIndex:indexSet.firstIndex];
}
else if ([[change objectForKey:NSKeyValueChangeKindKey] isEqualToNumber:@(NSKeyValueChangeRemoval)]){
NSIndexSet * indexSet = [change objectForKey:NSKeyValueChangeIndexesKey];
XLFormSectionDescriptor * removedSection = [[change objectForKey:NSKeyValueChangeOldKey] objectAtIndex:0];
else if ([[change objectForKey:NSKeyValueChangeKindKey] isEqualToNumber:@(NSKeyValueChangeRemoval)]) {
NSIndexSet *indexSet = [change objectForKey:NSKeyValueChangeIndexesKey];
XLFormSectionDescriptor *removedSection = [[change objectForKey:NSKeyValueChangeOldKey] objectAtIndex:0];
[self.delegate formSectionHasBeenRemoved:removedSection atIndex:indexSet.firstIndex];
}
}
@@ -401,10 +431,16 @@ NSString * const XLValidationStatusErrorKey = @"XLValidationStatusErrorKey";
-(void)dealloc
{
@try {
[self removeObserver:self forKeyPath:@"formSections"];
}
@catch (NSException * __unused exception) {}
[self removeObserver:self forKeyPath:XLFormSectionsKey];
[_formSections removeAllObjects];
_formSections = nil;
[_allSections removeAllObjects];
_allSections = nil;
[_allRowsByTag removeAllObjects];
_allRowsByTag = nil;
[_rowObservers removeAllObjects];
_rowObservers = nil;
}
#pragma mark - KVC
@@ -414,19 +450,23 @@ NSString * const XLValidationStatusErrorKey = @"XLValidationStatusErrorKey";
return self.formSections.count;
}
- (id)objectInFormSectionsAtIndex:(NSUInteger)index {
- (id)objectInFormSectionsAtIndex:(NSUInteger)index
{
return [self.formSections objectAtIndex:index];
}
- (NSArray *)formSectionsAtIndexes:(NSIndexSet *)indexes {
- (NSArray *)formSectionsAtIndexes:(NSIndexSet *)indexes
{
return [self.formSections objectsAtIndexes:indexes];
}
- (void)insertObject:(XLFormSectionDescriptor *)formSection inFormSectionsAtIndex:(NSUInteger)index {
- (void)insertObject:(XLFormSectionDescriptor *)formSection inFormSectionsAtIndex:(NSUInteger)index
{
[self.formSections insertObject:formSection atIndex:index];
}
- (void)removeObjectFromFormSectionsAtIndex:(NSUInteger)index {
- (void)removeObjectFromFormSectionsAtIndex:(NSUInteger)index
{
[self.formSections removeObjectAtIndex:index];
}
@@ -445,7 +485,8 @@ NSString * const XLValidationStatusErrorKey = @"XLValidationStatusErrorKey";
return [self.allSections objectsAtIndexes:indexes];
}
- (void)removeObjectFromAllSectionsAtIndex:(NSUInteger)index {
- (void)removeObjectFromAllSectionsAtIndex:(NSUInteger)index
{
XLFormSectionDescriptor* section = [self.allSections objectAtIndex:index];
[section.allRows enumerateObjectsUsingBlock:^(id obj, NSUInteger __unused idx, BOOL *stop) {
XLFormRowDescriptor * row = (id)obj;
@@ -456,7 +497,8 @@ NSString * const XLValidationStatusErrorKey = @"XLValidationStatusErrorKey";
[self.allSections removeObjectAtIndex:index];
}
- (void)insertObject:(XLFormSectionDescriptor *)section inAllSectionsAtIndex:(NSUInteger)index {
- (void)insertObject:(XLFormSectionDescriptor *)section inAllSectionsAtIndex:(NSUInteger)index
{
section.formDescriptor = self;
[self.allSections insertObject:section atIndex:index];
section.hidden = section.hidden;
@@ -466,24 +508,23 @@ NSString * const XLValidationStatusErrorKey = @"XLValidationStatusErrorKey";
row.hidden = row.hidden;
row.disabled = row.disabled;
}];
}
#pragma mark - EvaluateForm
-(void)forceEvaluate
{
for (XLFormSectionDescriptor* section in self.allSections){
for (XLFormRowDescriptor* row in section.allRows) {
for (XLFormSectionDescriptor *section in self.allSections) {
for (XLFormRowDescriptor *row in section.allRows) {
[self addRowToTagCollection:row];
}
}
for (XLFormSectionDescriptor* section in self.allSections){
for (XLFormRowDescriptor* row in section.allRows) {
for (XLFormSectionDescriptor *section in self.allSections) {
for (XLFormRowDescriptor *row in section.allRows) {
[row evaluateIsDisabled];
[row evaluateIsHidden];
}
[section evaluateIsHidden];
}
}
@@ -500,60 +541,65 @@ NSString * const XLValidationStatusErrorKey = @"XLValidationStatusErrorKey";
-(XLFormRowDescriptor *)nextRowDescriptorForRow:(XLFormRowDescriptor *)row
{
XLFormRowDescriptor *result = nil;
NSUInteger indexOfRow = [row.sectionDescriptor.formRows indexOfObject:row];
if (indexOfRow != NSNotFound){
if (indexOfRow + 1 < row.sectionDescriptor.formRows.count){
return [row.sectionDescriptor.formRows objectAtIndex:++indexOfRow];
if (indexOfRow != NSNotFound) {
if (indexOfRow + 1 < row.sectionDescriptor.formRows.count) {
result = [row.sectionDescriptor.formRows objectAtIndex:++indexOfRow];
}
else{
else {
NSUInteger sectionIndex = [self.formSections indexOfObject:row.sectionDescriptor];
NSUInteger numberOfSections = [self.formSections count];
if (sectionIndex != NSNotFound && sectionIndex < numberOfSections - 1){
if (sectionIndex != NSNotFound && sectionIndex < numberOfSections - 1) {
sectionIndex++;
XLFormSectionDescriptor * sectionDescriptor;
while ([[(sectionDescriptor = [row.sectionDescriptor.formDescriptor.formSections objectAtIndex:sectionIndex]) formRows] count] == 0 && sectionIndex < numberOfSections - 1){
XLFormSectionDescriptor *sectionDescriptor;
while ([[(sectionDescriptor = [row.sectionDescriptor.formDescriptor.formSections objectAtIndex:sectionIndex]) formRows] count] == 0 && sectionIndex < numberOfSections - 1) {
sectionIndex++;
}
return [sectionDescriptor.formRows firstObject];
result = [sectionDescriptor.formRows firstObject];
}
}
}
return nil;
return result;
}
-(XLFormRowDescriptor *)previousRowDescriptorForRow:(XLFormRowDescriptor *)row
{
XLFormRowDescriptor *result = nil;
NSUInteger indexOfRow = [row.sectionDescriptor.formRows indexOfObject:row];
if (indexOfRow != NSNotFound){
if (indexOfRow > 0 ){
return [row.sectionDescriptor.formRows objectAtIndex:--indexOfRow];
if (indexOfRow != NSNotFound) {
if (indexOfRow > 0 ) {
result = [row.sectionDescriptor.formRows objectAtIndex:--indexOfRow];
}
else{
else {
NSUInteger sectionIndex = [self.formSections indexOfObject:row.sectionDescriptor];
if (sectionIndex != NSNotFound && sectionIndex > 0){
if (sectionIndex != NSNotFound && sectionIndex > 0) {
sectionIndex--;
XLFormSectionDescriptor * sectionDescriptor;
while ([[(sectionDescriptor = [row.sectionDescriptor.formDescriptor.formSections objectAtIndex:sectionIndex]) formRows] count] == 0 && sectionIndex > 0 ){
while ([[(sectionDescriptor = [row.sectionDescriptor.formDescriptor.formSections objectAtIndex:sectionIndex]) formRows] count] == 0 && sectionIndex > 0 ) {
sectionIndex--;
}
return [sectionDescriptor.formRows lastObject];
result = [sectionDescriptor.formRows lastObject];
}
}
}
return nil;
return result;
}
-(void)addRowToTagCollection:(XLFormRowDescriptor*) rowDescriptor
-(void)addRowToTagCollection:(XLFormRowDescriptor *)rowDescriptor
{
if (rowDescriptor.tag) {
if (rowDescriptor.tag.length) {
self.allRowsByTag[rowDescriptor.tag] = rowDescriptor;
}
}
-(void)removeRowFromTagCollection:(XLFormRowDescriptor *)rowDescriptor
{
if (rowDescriptor.tag){
if (rowDescriptor.tag.length) {
[self.allRowsByTag removeObjectForKey:rowDescriptor.tag];
}
}
@@ -561,32 +607,36 @@ NSString * const XLValidationStatusErrorKey = @"XLValidationStatusErrorKey";
-(void)addObserversOfObject:(id)sectionOrRow predicateType:(XLPredicateType)predicateType
{
NSPredicate* predicate;
NSPredicate *predicate;
id descriptor;
switch(predicateType){
switch (predicateType) {
case XLPredicateTypeHidden:
if ([sectionOrRow isKindOfClass:([XLFormRowDescriptor class])]) {
descriptor = ((XLFormRowDescriptor*)sectionOrRow).tag;
predicate = ((XLFormRowDescriptor*)sectionOrRow).hidden;
descriptor = ((XLFormRowDescriptor *)sectionOrRow).tag;
predicate = ((XLFormRowDescriptor *)sectionOrRow).hidden;
}
else if ([sectionOrRow isKindOfClass:([XLFormSectionDescriptor class])]) {
descriptor = sectionOrRow;
predicate = ((XLFormSectionDescriptor*)sectionOrRow).hidden;
predicate = ((XLFormSectionDescriptor *)sectionOrRow).hidden;
}
break;
case XLPredicateTypeDisabled:
if ([sectionOrRow isKindOfClass:([XLFormRowDescriptor class])]) {
descriptor = ((XLFormRowDescriptor*)sectionOrRow).tag;
predicate = ((XLFormRowDescriptor*)sectionOrRow).disabled;
descriptor = ((XLFormRowDescriptor *)sectionOrRow).tag;
predicate = ((XLFormRowDescriptor *)sectionOrRow).disabled;
}
else {
return;
}
else return;
break;
}
NSMutableArray* tags = [predicate getPredicateVars];
for (NSString* tag in tags) {
NSString* auxTag = [tag formKeyForPredicateType:predicateType];
if (!self.rowObservers[auxTag]){
NSMutableArray *tags = [predicate getPredicateVars];
for (NSString *tag in tags) {
NSString *auxTag = [tag formKeyForPredicateType:predicateType];
if (!self.rowObservers[auxTag]) {
self.rowObservers[auxTag] = [NSMutableArray array];
}
if (![self.rowObservers[auxTag] containsObject:descriptor])
@@ -597,31 +647,32 @@ NSString * const XLValidationStatusErrorKey = @"XLValidationStatusErrorKey";
-(void)removeObserversOfObject:(id)sectionOrRow predicateType:(XLPredicateType)predicateType
{
NSPredicate* predicate;
NSPredicate *predicate;
id descriptor;
switch(predicateType){
switch(predicateType) {
case XLPredicateTypeHidden:
if ([sectionOrRow isKindOfClass:([XLFormRowDescriptor class])]) {
descriptor = ((XLFormRowDescriptor*)sectionOrRow).tag;
predicate = ((XLFormRowDescriptor*)sectionOrRow).hidden;
descriptor = ((XLFormRowDescriptor *)sectionOrRow).tag;
predicate = ((XLFormRowDescriptor *)sectionOrRow).hidden;
}
else if ([sectionOrRow isKindOfClass:([XLFormSectionDescriptor class])]) {
descriptor = sectionOrRow;
predicate = ((XLFormSectionDescriptor*)sectionOrRow).hidden;
predicate = ((XLFormSectionDescriptor *)sectionOrRow).hidden;
}
break;
case XLPredicateTypeDisabled:
if ([sectionOrRow isKindOfClass:([XLFormRowDescriptor class])]) {
descriptor = ((XLFormRowDescriptor*)sectionOrRow).tag;
predicate = ((XLFormRowDescriptor*)sectionOrRow).disabled;
descriptor = ((XLFormRowDescriptor *)sectionOrRow).tag;
predicate = ((XLFormRowDescriptor *)sectionOrRow).disabled;
}
break;
}
if (descriptor && [predicate isKindOfClass:[NSPredicate class] ]) {
NSMutableArray* tags = [predicate getPredicateVars];
for (NSString* tag in tags) {
NSString* auxTag = [tag formKeyForPredicateType:predicateType];
if (self.rowObservers[auxTag]){
if (descriptor && [predicate isKindOfClass:[NSPredicate class]]) {
NSMutableArray *tags = [predicate getPredicateVars];
for (NSString *tag in tags) {
NSString *auxTag = [tag formKeyForPredicateType:predicateType];
if (self.rowObservers[auxTag]) {
[self.rowObservers[auxTag] removeObject:descriptor];
}
}
@@ -29,7 +29,6 @@
@interface XLFormImageCell() <UIImagePickerControllerDelegate, UINavigationControllerDelegate>
{
UIPopoverController *popoverController;
UIImagePickerController *imagePickerController;
UIAlertController *alertController;
}
@@ -72,6 +71,7 @@
- (void)formDescriptorCellDidSelectedWithFormController:(XLFormViewController *)controller
{
__weak typeof(self) weak = self;
alertController = [UIAlertController alertControllerWithTitle: self.rowDescriptor.title
message: nil
preferredStyle: UIAlertControllerStyleActionSheet];
@@ -79,14 +79,14 @@
[alertController addAction:[UIAlertAction actionWithTitle: NSLocalizedString(@"Choose From Library", nil)
style: UIAlertActionStyleDefault
handler: ^(UIAlertAction * _Nonnull action) {
[self openImage:UIImagePickerControllerSourceTypePhotoLibrary];
[weak openImage:UIImagePickerControllerSourceTypePhotoLibrary];
}]];
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
[alertController addAction:[UIAlertAction actionWithTitle: NSLocalizedString(@"Take Photo", nil)
style: UIAlertActionStyleDefault
handler: ^(UIAlertAction * _Nonnull action) {
[self openImage:UIImagePickerControllerSourceTypeCamera];
[weak openImage:UIImagePickerControllerSourceTypeCamera];
}]];
}
@@ -101,7 +101,7 @@
}
dispatch_async(dispatch_get_main_queue(), ^{
[self.formViewController presentViewController:alertController animated: true completion: nil];
[weak.formViewController presentViewController:self->alertController animated: true completion: nil];
});
}
@@ -113,16 +113,15 @@
imagePickerController.sourceType = source;
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
popoverController = [[UIPopoverController alloc] initWithContentViewController:imagePickerController];
[popoverController presentPopoverFromRect: self.contentView.frame
inView: self.formViewController.view
permittedArrowDirections: UIPopoverArrowDirectionAny
animated: YES];
} else {
[self.formViewController presentViewController: imagePickerController
animated: YES
completion: nil];
imagePickerController.modalPresentationStyle = UIModalPresentationPopover;
imagePickerController.popoverPresentationController.sourceRect = self.contentView.frame;
imagePickerController.popoverPresentationController.sourceView = self.formViewController.view;
imagePickerController.popoverPresentationController.permittedArrowDirections = UIPopoverArrowDirectionAny;
}
[self.formViewController presentViewController: imagePickerController
animated: YES
completion: nil];
}
#pragma mark - UIImagePickerControllerDelegate
@@ -138,8 +137,8 @@
}
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
if (popoverController && popoverController.isPopoverVisible) {
[popoverController dismissPopoverAnimated: YES];
if (self.formViewController.presentedViewController && self.formViewController.presentedViewController.modalPresentationStyle == UIModalPresentationPopover) {
[self.formViewController dismissViewControllerAnimated:YES completion:nil];
}
} else {
[self.formViewController dismissViewControllerAnimated: YES completion: nil];
@@ -28,11 +28,6 @@
#import "NSObject+XLFormAdditions.h"
#import "XLFormLeftRightSelectorCell.h"
@interface XLFormLeftRightSelectorCell() <UIActionSheetDelegate>
@end
@implementation XLFormLeftRightSelectorCell
{
UITextField * _constraintTextField;
@@ -195,76 +190,24 @@
-(void)leftButtonPressed:(UIButton *)leftButton
{
#if __IPHONE_OS_VERSION_MAX_ALLOWED < 80000
UIActionSheet * actionSheet = [[UIActionSheet alloc] initWithTitle:self.rowDescriptor.selectorTitle
delegate:self cancelButtonTitle:nil
destructiveButtonTitle:nil
otherButtonTitles:nil];
UIAlertController * alertController = [UIAlertController alertControllerWithTitle:self.rowDescriptor.selectorTitle
message:nil
preferredStyle:UIAlertControllerStyleActionSheet];
[alertController addAction:[UIAlertAction actionWithTitle:NSLocalizedString(@"Cancel", nil)
style:UIAlertActionStyleCancel
handler:nil]];
__weak typeof(self) weak = self;
for (XLFormLeftRightSelectorOption * leftOption in self.rowDescriptor.selectorOptions) {
[actionSheet addButtonWithTitle:[leftOption.leftValue displayText]];
[alertController addAction:[UIAlertAction actionWithTitle:[leftOption.leftValue displayText]
style:UIAlertActionStyleDefault
handler:^(UIAlertAction *action) {
weak.rowDescriptor.value = [weak chooseNewRightValueFromOption:leftOption];
weak.rowDescriptor.leftRightSelectorLeftOptionSelected = [weak leftOptionForDescription:[leftOption.leftValue displayText]].leftValue;
[weak.formViewController updateFormRow:weak.rowDescriptor];
}]];
}
actionSheet.cancelButtonIndex = [actionSheet addButtonWithTitle:NSLocalizedString(@"Cancel", nil)];
actionSheet.tag = [self.rowDescriptor hash];
[actionSheet showInView:self.formViewController.view];
#else
if ([UIAlertController class]) {
UIAlertController * alertController = [UIAlertController alertControllerWithTitle:self.rowDescriptor.selectorTitle
message:nil
preferredStyle:UIAlertControllerStyleActionSheet];
[alertController addAction:[UIAlertAction actionWithTitle:NSLocalizedString(@"Cancel", nil)
style:UIAlertActionStyleCancel
handler:nil]];
__weak __typeof(self)weakSelf = self;
for (XLFormLeftRightSelectorOption * leftOption in self.rowDescriptor.selectorOptions) {
[alertController addAction:[UIAlertAction actionWithTitle:[leftOption.leftValue displayText]
style:UIAlertActionStyleDefault
handler:^(UIAlertAction *action) {
weakSelf.rowDescriptor.value = [self chooseNewRightValueFromOption:leftOption];
weakSelf.rowDescriptor.leftRightSelectorLeftOptionSelected = [self leftOptionForDescription:[leftOption.leftValue displayText]].leftValue;
[weakSelf.formViewController updateFormRow:weakSelf.rowDescriptor];
}]];
}
[self.formViewController presentViewController:alertController animated:YES completion:nil];
}
#ifndef XL_APP_EXTENSIONS
else{
UIActionSheet * actionSheet = [[UIActionSheet alloc] initWithTitle:self.rowDescriptor.selectorTitle
delegate:self cancelButtonTitle:nil
destructiveButtonTitle:nil
otherButtonTitles:nil];
for (XLFormLeftRightSelectorOption * leftOption in self.rowDescriptor.selectorOptions) {
[actionSheet addButtonWithTitle:[leftOption.leftValue displayText]];
}
actionSheet.cancelButtonIndex = [actionSheet addButtonWithTitle:NSLocalizedString(@"Cancel", nil)];
actionSheet.tag = [self.rowDescriptor hash];
[actionSheet showInView:self.formViewController.view];
}
#endif
#endif
[self.formViewController presentViewController:alertController animated:YES completion:nil];
}
#if __IPHONE_OS_VERSION_MIN_REQUIRED < 80000
#pragma mark - UIActionSheetDelegate
- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
{
if ([actionSheet cancelButtonIndex] != buttonIndex){
NSString * title = [actionSheet buttonTitleAtIndex:buttonIndex];
if (![self.rowDescriptor.leftRightSelectorLeftOptionSelected isEqual:[self leftOptionForDescription:title].leftValue]){
self.rowDescriptor.value = [self chooseNewRightValueFromOption:[self leftOptionForDescription:title]];
self.rowDescriptor.leftRightSelectorLeftOptionSelected = [self leftOptionForDescription:title].leftValue;
[self.formViewController updateFormRow:self.rowDescriptor];
}
}
}
#endif
@end
@@ -28,8 +28,8 @@
@interface XLFormOptionsObject : NSObject <XLFormOptionObject,NSCoding>
@property (nonatomic) NSString * formDisplaytext;
@property (nonatomic) id formValue;
@property (nonatomic, copy) NSString * formDisplaytext;
@property (nonatomic, strong) id formValue;
+(XLFormOptionsObject *)formOptionsObjectWithValue:(id)value displayText:(NSString *)displayText;
+(XLFormOptionsObject *)formOptionsOptionForValue:(id)value fromOptions:(NSArray *)options;
@@ -107,4 +107,9 @@
}
-(NSUInteger)hash
{
return [[self formValue ] hash];
}
@end
@@ -28,7 +28,7 @@
#import "XLFormRowDescriptorViewController.h"
#import "XLFormRowDescriptor.h"
@interface XLFormOptionsViewController : UITableViewController<XLFormRowDescriptorViewController, XLFormRowDescriptorPopoverViewController>
@interface XLFormOptionsViewController : UITableViewController<XLFormRowDescriptorViewController>
- (instancetype)initWithStyle:(UITableViewStyle)style;
@@ -34,8 +34,8 @@
@interface XLFormOptionsViewController () <UITableViewDataSource>
@property NSString * titleHeaderSection;
@property NSString * titleFooterSection;
@property (nonatomic, copy) NSString * titleHeaderSection;
@property (nonatomic, copy) NSString * titleFooterSection;
@end
@@ -45,7 +45,6 @@
@synthesize titleHeaderSection = _titleHeaderSection;
@synthesize titleFooterSection = _titleFooterSection;
@synthesize rowDescriptor = _rowDescriptor;
@synthesize popoverController = __popoverController;
- (instancetype)initWithStyle:(UITableViewStyle)style
{
@@ -153,9 +152,8 @@
self.rowDescriptor.value = cellObject;
cell.accessoryType = UITableViewCellAccessoryCheckmark;
}
if (self.popoverController){
[self.popoverController dismissPopoverAnimated:YES];
[self.popoverController.delegate popoverControllerDidDismissPopover:self.popoverController];
if (self.modalPresentationStyle == UIModalPresentationPopover){
[[self presentingViewController] dismissViewControllerAnimated:YES completion:nil];
}
else if ([self.parentViewController isKindOfClass:[UINavigationController class]]){
[self.navigationController popViewControllerAnimated:YES];
@@ -28,6 +28,6 @@
@interface XLFormPickerCell : XLFormBaseCell<XLFormInlineRowDescriptorCell>
@property (nonatomic) UIPickerView * pickerView;
@property (nonatomic, weak) UIPickerView * pickerView;
@end
@@ -56,23 +56,19 @@
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];
UIPickerView *pickerView = [UIPickerView autolayoutView];
pickerView.delegate = self;
pickerView.dataSource = self;
[self.contentView addSubview:pickerView];
_pickerView = 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}]];
}
@@ -29,8 +29,8 @@
@interface XLFormRegexValidator : XLFormValidator
@property NSString *msg;
@property NSString *regex;
@property (nonatomic, copy) NSString *msg;
@property (nonatomic, copy) NSString *regex;
- (instancetype)initWithMsg:(NSString*)msg andRegexString:(NSString*)regex;
+ (XLFormRegexValidator *)formRegexValidatorWithMsg:(NSString *)msg regex:(NSString *)regex;
@@ -43,22 +43,22 @@ typedef NS_ENUM(NSUInteger, XLFormPresentationMode) {
XLFormPresentationModePresent
};
typedef void(^XLOnChangeBlock)(id __nullable oldValue,id __nullable newValue,XLFormRowDescriptor* __nonnull rowDescriptor);
typedef void(^XLOnChangeBlock)(id __nullable oldValue, id __nullable newValue, XLFormRowDescriptor * __nonnull rowDescriptor);
@interface XLFormRowDescriptor : NSObject
@property (nullable) id cellClass;
@property (readwrite, nullable) NSString * tag;
@property (readonly, nonnull) NSString * rowType;
@property (nullable) NSString * title;
@property (nonatomic, nullable) id value;
@property (nullable) Class valueTransformer;
@property UITableViewCellStyle cellStyle;
@property (nonatomic) CGFloat height;
@property (nonatomic, nullable, strong) id cellClass;
@property (nonatomic, nullable, copy , readwrite) NSString * tag;
@property (nonatomic, nonnull , copy , readonly) NSString * rowType;
@property (nonatomic, nullable, copy ) NSString * title;
@property (nonatomic, nullable, strong) id value;
@property (nonatomic, nullable, strong) Class valueTransformer;
@property (nonatomic, assign ) UITableViewCellStyle cellStyle;
@property (nonatomic, assign ) CGFloat height;
@property (copy, nullable) XLOnChangeBlock onChangeBlock;
@property BOOL useValueFormatterDuringInput;
@property (nullable) NSFormatter *valueFormatter;
@property (nonatomic, copy , nullable) XLOnChangeBlock onChangeBlock;
@property (nonatomic, assign) BOOL useValueFormatterDuringInput;
@property (nonatomic, strong, nullable) NSFormatter *valueFormatter;
// returns the display text for the row descriptor, taking into account NSFormatters and default placeholder values
- (nonnull NSString *) displayTextValue;
@@ -66,20 +66,22 @@ typedef void(^XLOnChangeBlock)(id __nullable oldValue,id __nullable newValue,XLF
// returns the editing text value for the row descriptor, taking into account NSFormatters.
- (nonnull NSString *) editTextValue;
@property (nonatomic, readonly, nonnull) NSMutableDictionary * cellConfig;
@property (nonatomic, readonly, nonnull) NSMutableDictionary * cellConfigForSelector;
@property (nonatomic, readonly, nonnull) NSMutableDictionary * cellConfigIfDisabled;
@property (nonatomic, readonly, nonnull) NSMutableDictionary * cellConfigAtConfigure;
@property (nonatomic, readonly, nonnull, strong) NSMutableDictionary * cellConfig;
@property (nonatomic, readonly, nonnull, strong) NSMutableDictionary * cellConfigForSelector;
@property (nonatomic, readonly, nonnull, strong) NSMutableDictionary * cellConfigIfDisabled;
@property (nonatomic, readonly, nonnull, strong) NSMutableDictionary * cellConfigAtConfigure;
@property (nonnull) id disabled;
@property (nonatomic, nonnull, strong) id disabled;
-(BOOL)isDisabled;
@property (nonnull) id hidden;
@property (nonatomic, nonnull, strong) id hidden;
-(BOOL)isHidden;
@property (getter=isRequired) BOOL required;
@property (nonnull) XLFormAction * action;
@property (getter=isRequired, nonatomic, assign) BOOL required;
@property (weak, null_unspecified) XLFormSectionDescriptor * sectionDescriptor;
@property (nonatomic, nonnull, strong) XLFormAction * action;
@property (nonatomic, weak, null_unspecified) XLFormSectionDescriptor * sectionDescriptor;
+(nonnull instancetype)formRowDescriptorWithTag:(nullable NSString *)tag rowType:(nonnull NSString *)rowType;
+(nonnull instancetype)formRowDescriptorWithTag:(nullable NSString *)tag rowType:(nonnull NSString *)rowType title:(nullable NSString *)title;
@@ -87,7 +89,7 @@ typedef void(^XLOnChangeBlock)(id __nullable oldValue,id __nullable newValue,XLF
-(nonnull XLFormBaseCell *)cellForFormController:(nonnull XLFormViewController *)formController;
@property (nullable) NSString *requireMsg;
@property (nonatomic, nullable, copy) NSString *requireMsg;
-(void)addValidator:(nonnull id<XLFormValidatorProtocol>)validator;
-(void)removeValidator:(nonnull id<XLFormValidatorProtocol>)validator;
-(nullable XLFormValidationStatus *)doValidation;
@@ -95,9 +97,9 @@ typedef void(^XLOnChangeBlock)(id __nullable oldValue,id __nullable newValue,XLF
// ===========================
// property used for Selectors
// ===========================
@property (nullable) NSString * noValueDisplayText;
@property (nullable) NSString * selectorTitle;
@property (nullable) NSArray * selectorOptions;
@property (nonatomic, nullable, copy) NSString * noValueDisplayText;
@property (nonatomic, nullable, copy) NSString * selectorTitle;
@property (nonatomic, nullable, strong) NSArray * selectorOptions;
@property (null_unspecified) id leftRightSelectorLeftOptionSelected;
@@ -126,13 +128,13 @@ typedef NS_ENUM(NSUInteger, XLFormLeftRightSelectorOptionLeftValueChangePolicy)
@interface XLFormLeftRightSelectorOption : NSObject
@property (nonatomic, assign) XLFormLeftRightSelectorOptionLeftValueChangePolicy leftValueChangePolicy;
@property (readonly, nonnull) id leftValue;
@property (readonly, nonnull) NSArray * rightOptions;
@property (readonly, null_unspecified) NSString * httpParameterKey;
@property (nullable) Class rightSelectorControllerClass;
@property (nonatomic, readonly, nonnull) id leftValue;
@property (nonatomic, readonly, nonnull) NSArray * rightOptions;
@property (nonatomic, readonly, null_unspecified, copy) NSString * httpParameterKey;
@property (nonatomic, nullable) Class rightSelectorControllerClass;
@property (nullable) NSString * noValueDisplayText;
@property (nullable) NSString * selectorTitle;
@property (nonatomic, nullable, copy) NSString * noValueDisplayText;
@property (nonatomic, nullable, copy) NSString * selectorTitle;
+(nonnull XLFormLeftRightSelectorOption *)formLeftRightSelectorOptionWithLeftValue:(nonnull id)leftValue
@@ -154,16 +156,16 @@ typedef NS_ENUM(NSUInteger, XLFormLeftRightSelectorOptionLeftValueChangePolicy)
@interface XLFormAction : NSObject
@property (nullable, nonatomic, strong) Class viewControllerClass;
@property (nullable, nonatomic, strong) NSString * viewControllerStoryboardId;
@property (nullable, nonatomic, strong) NSString * viewControllerNibName;
@property (nullable, nonatomic) Class viewControllerClass;
@property (nullable, nonatomic, copy) NSString * viewControllerStoryboardId;
@property (nullable, nonatomic, copy) NSString * viewControllerNibName;
@property (nonatomic) XLFormPresentationMode viewControllerPresentationMode;
@property (nonatomic, assign) XLFormPresentationMode viewControllerPresentationMode;
@property (nullable, nonatomic, strong) void (^formBlock)(XLFormRowDescriptor * __nonnull sender);
@property (nullable, nonatomic, copy) void (^formBlock)(XLFormRowDescriptor * __nonnull sender);
@property (nullable, nonatomic) SEL formSelector;
@property (nullable, nonatomic, strong) NSString * formSegueIdenfifier DEPRECATED_ATTRIBUTE DEPRECATED_MSG_ATTRIBUTE("Use formSegueIdentifier instead");
@property (nullable, nonatomic, strong) NSString * formSegueIdentifier;
@property (nullable, nonatomic, strong) Class formSegueClass;
@property (nullable, nonatomic, copy) NSString * formSegueIdenfifier DEPRECATED_ATTRIBUTE DEPRECATED_MSG_ATTRIBUTE("Use formSegueIdentifier instead");
@property (nullable, nonatomic, copy) NSString * formSegueIdentifier;
@property (nullable, nonatomic) Class formSegueClass;
@end
@@ -33,7 +33,7 @@ CGFloat XLFormRowInitialHeight = -2;
@interface XLFormDescriptor (_XLFormRowDescriptor)
@property (readonly) NSDictionary* allRowsByTag;
@property (nonatomic, readonly, strong) NSDictionary *allRowsByTag;
-(void)addObserversOfObject:(id)sectionOrRow predicateType:(XLPredicateType)predicateType;
-(void)removeObserversOfObject:(id)sectionOrRow predicateType:(XLPredicateType)predicateType;
@@ -42,22 +42,26 @@ CGFloat XLFormRowInitialHeight = -2;
@interface XLFormSectionDescriptor (_XLFormRowDescriptor)
-(void)showFormRow:(XLFormRowDescriptor*)formRow;
-(void)hideFormRow:(XLFormRowDescriptor*)formRow;
-(void)showFormRow:(XLFormRowDescriptor *)formRow;
-(void)hideFormRow:(XLFormRowDescriptor *)formRow;
@end
#import "NSObject+XLFormAdditions.h"
NSString * const XLValueKey = @"value";
NSString * const XLDisablePredicateCacheKey = @"disablePredicateCache";
NSString * const XLHidePredicateCacheKey = @"hidePredicateCache";
@interface XLFormRowDescriptor() <NSCopying>
@property XLFormBaseCell * cell;
@property (nonatomic) NSMutableArray *validators;
@property (nonatomic, strong) XLFormBaseCell *cell;
@property (nonatomic, strong) NSMutableArray *validators;
@property BOOL isDirtyDisablePredicateCache;
@property (nonatomic) NSNumber* disablePredicateCache;
@property BOOL isDirtyHidePredicateCache;
@property (nonatomic) NSNumber* hidePredicateCache;
@property (nonatomic, assign) BOOL isDirtyDisablePredicateCache;
@property (nonatomic, copy ) NSNumber *disablePredicateCache;
@property (nonatomic, assign) BOOL isDirtyHidePredicateCache;
@property (nonatomic, copy ) NSNumber *hidePredicateCache;
@end
@@ -81,8 +85,7 @@ CGFloat XLFormRowInitialHeight = -2;
-(instancetype)initWithTag:(NSString *)tag rowType:(NSString *)rowType title:(NSString *)title;
{
self = [super init];
if (self){
if (self = [super init]) {
NSAssert(((![rowType isEqualToString:XLFormRowDescriptorTypeSelectorPopover] && ![rowType isEqualToString:XLFormRowDescriptorTypeMultipleSelectorPopover]) || (([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad) && ([rowType isEqualToString:XLFormRowDescriptorTypeSelectorPopover] || [rowType isEqualToString:XLFormRowDescriptorTypeMultipleSelectorPopover]))), @"You must be running under UIUserInterfaceIdiomPad to use either XLFormRowDescriptorTypeSelectorPopover or XLFormRowDescriptorTypeMultipleSelectorPopover rows.");
_tag = tag;
_disabled = @NO;
@@ -99,11 +102,19 @@ CGFloat XLFormRowInitialHeight = -2;
_isDirtyHidePredicateCache = YES;
_hidePredicateCache = nil;
_height = XLFormRowInitialHeight;
[self addObserver:self forKeyPath:@"value" options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew context:0];
[self addObserver:self forKeyPath:@"disablePredicateCache" options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew context:0];
[self addObserver:self forKeyPath:@"hidePredicateCache" options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew context:0];
[self addObserver:self
forKeyPath:XLValueKey
options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew context:0];
[self addObserver:self
forKeyPath:XLDisablePredicateCacheKey
options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew context:0];
[self addObserver:self
forKeyPath:XLHidePredicateCacheKey
options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew context:0];
}
return self;
}
@@ -119,13 +130,17 @@ CGFloat XLFormRowInitialHeight = -2;
-(XLFormBaseCell *)cellForFormController:(XLFormViewController * __unused)formController
{
if (!_cell){
if (!_cell) {
id cellClass = self.cellClass ?: [XLFormViewController cellClassesForRowDescriptorTypes][self.rowType];
NSBundle *bundle = [NSBundle mainBundle];
NSString *cellClassString = cellClass;
NSString *cellResource = nil;
NSBundle *bundleForCaller = [NSBundle bundleForClass:self.class];
NSAssert(cellClass, @"Not defined XLFormRowDescriptorType: %@", self.rowType ?: @"");
if ([cellClass isKindOfClass:[NSString class]]) {
NSString *cellClassString = cellClass;
NSString *cellResource = nil;
NSBundle *bundle = nil;
if ([cellClassString rangeOfString:@"/"].location != NSNotFound) {
NSArray *components = [cellClassString componentsSeparatedByString:@"/"];
cellResource = [components lastObject];
@@ -133,94 +148,111 @@ CGFloat XLFormRowInitialHeight = -2;
NSString *bundlePath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:folderName];
bundle = [NSBundle bundleWithPath:bundlePath];
} else {
bundle = [NSBundle bundleForClass:NSClassFromString(cellClass)];
cellResource = cellClassString;
}
NSParameterAssert(bundle != nil);
NSParameterAssert(cellResource != nil);
if ([bundle pathForResource:cellResource ofType:@"nib"]){
_cell = [[bundle loadNibNamed:cellResource owner:nil options:nil] firstObject];
cellResource = [cellClassString componentsSeparatedByString:@"."].lastObject;
}
} else {
cellResource = [NSStringFromClass(cellClass) componentsSeparatedByString:@"."].lastObject;
}
if ([bundle pathForResource:cellResource ofType:@"nib"]) {
_cell = [[bundle loadNibNamed:cellResource owner:nil options:nil] firstObject];
} else if ([bundleForCaller pathForResource:cellResource ofType:@"nib"]) {
_cell = [[bundleForCaller loadNibNamed:cellResource owner:nil options:nil] firstObject];
} else {
_cell = [[cellClass alloc] initWithStyle:self.cellStyle reuseIdentifier:nil];
}
_cell.rowDescriptor = self;
NSAssert([_cell isKindOfClass:[XLFormBaseCell class]], @"UITableViewCell must extend from XLFormBaseCell");
[self configureCellAtCreationTime];
}
return _cell;
}
- (void)configureCellAtCreationTime
{
[self.cellConfigAtConfigure enumerateKeysAndObjectsUsingBlock:^(NSString *keyPath, id value, __unused BOOL *stop) {
[_cell setValue:(value == [NSNull null]) ? nil : value forKeyPath:keyPath];
[self.cell setValue:(value == [NSNull null]) ? nil : value forKeyPath:keyPath];
}];
}
-(NSMutableDictionary *)cellConfig
{
if (_cellConfig) return _cellConfig;
_cellConfig = [NSMutableDictionary dictionary];
if (!_cellConfig) {
_cellConfig = [NSMutableDictionary dictionary];
}
return _cellConfig;
}
-(NSMutableDictionary *)cellConfigForSelector
{
if (_cellConfigForSelector) return _cellConfigForSelector;
_cellConfigForSelector = [NSMutableDictionary dictionary];
if (!_cellConfigForSelector) {
_cellConfigForSelector = [NSMutableDictionary dictionary];
}
return _cellConfigForSelector;
}
-(NSMutableDictionary *)cellConfigIfDisabled
{
if (_cellConfigIfDisabled) return _cellConfigIfDisabled;
_cellConfigIfDisabled = [NSMutableDictionary dictionary];
if (!_cellConfigIfDisabled) {
_cellConfigIfDisabled = [NSMutableDictionary dictionary];
}
return _cellConfigIfDisabled;
}
-(NSMutableDictionary *)cellConfigAtConfigure
{
if (_cellConfigAtConfigure) return _cellConfigAtConfigure;
_cellConfigAtConfigure = [NSMutableDictionary dictionary];
if (!_cellConfigAtConfigure) {
_cellConfigAtConfigure = [NSMutableDictionary dictionary];
}
return _cellConfigAtConfigure;
}
-(NSString*)editTextValue
-(NSString *)editTextValue
{
NSString *result = @"";
if (self.value) {
if (self.valueFormatter) {
if (self.useValueFormatterDuringInput) {
return [self displayTextValue];
}else{
// have formatter, but we don't want to use it during editing
return [self.value displayText];
result = [self displayTextValue];
}
else {
// have formatter, but we don't want to use it during editing
result = [self.value displayText];
}
}else{
// have value, but no formatter, use the value's displayText
return [self.value displayText];
}
}else{
// placeholder
return @"";
else {
// have value, but no formatter, use the value's displayText
result = [self.value displayText];
}
}
return result;
}
-(NSString*)displayTextValue
-(NSString *)displayTextValue
{
NSString *result = self.noValueDisplayText;
if (self.value) {
if (self.valueFormatter) {
return [self.valueFormatter stringForObjectValue:self.value];
result = [self.valueFormatter stringForObjectValue:self.value];
}
else{
return [self.value displayText];
else {
result = [self.value displayText];
}
}
else {
return self.noValueDisplayText;
}
return result;
}
-(NSString *)description
@@ -230,9 +262,10 @@ CGFloat XLFormRowInitialHeight = -2;
-(XLFormAction *)action
{
if (!_action){
if (!_action) {
_action = [[XLFormAction alloc] init];
}
return _action;
}
@@ -243,13 +276,15 @@ CGFloat XLFormRowInitialHeight = -2;
-(CGFloat)height
{
if (_height == XLFormRowInitialHeight){
if (_height == XLFormRowInitialHeight) {
if ([[self.cell class] respondsToSelector:@selector(formDescriptorCellHeightForRowDescriptor:)]){
return [[self.cell class] formDescriptorCellHeightForRowDescriptor:self];
} else {
}
else {
_height = XLFormUnspecifiedCellHeight;
}
}
return _height;
}
@@ -260,71 +295,76 @@ CGFloat XLFormRowInitialHeight = -2;
// In the implementation
-(id)copyWithZone:(NSZone *)zone
{
XLFormRowDescriptor * rowDescriptorCopy = [XLFormRowDescriptor formRowDescriptorWithTag:nil rowType:[self.rowType copy] title:[self.title copy]];
XLFormRowDescriptor *rowDescriptorCopy = [XLFormRowDescriptor formRowDescriptorWithTag:nil
rowType:[self.rowType copy]
title:[self.title copy]];
rowDescriptorCopy.cellClass = [self.cellClass copy];
[rowDescriptorCopy.cellConfig addEntriesFromDictionary:self.cellConfig];
[rowDescriptorCopy.cellConfigAtConfigure addEntriesFromDictionary:self.cellConfigAtConfigure];
rowDescriptorCopy.valueTransformer = [self.valueTransformer copy];
rowDescriptorCopy->_hidden = _hidden;
rowDescriptorCopy->_disabled = _disabled;
rowDescriptorCopy.hidden = self.hidden;
rowDescriptorCopy.disabled = self.disabled;
rowDescriptorCopy.required = self.isRequired;
rowDescriptorCopy.isDirtyDisablePredicateCache = YES;
rowDescriptorCopy.isDirtyHidePredicateCache = YES;
rowDescriptorCopy.validators = [self.validators mutableCopy];
// =====================
// properties for Button
// =====================
rowDescriptorCopy.action = [self.action copy];
// ===========================
// property used for Selectors
// ===========================
rowDescriptorCopy.noValueDisplayText = [self.noValueDisplayText copy];
rowDescriptorCopy.selectorTitle = [self.selectorTitle copy];
rowDescriptorCopy.selectorOptions = [self.selectorOptions copy];
rowDescriptorCopy.leftRightSelectorLeftOptionSelected = [self.leftRightSelectorLeftOptionSelected copy];
return rowDescriptorCopy;
}
-(void)dealloc
{
[self removeObserver:self forKeyPath:XLValueKey];
[self removeObserver:self forKeyPath:XLDisablePredicateCacheKey];
[self removeObserver:self forKeyPath:XLHidePredicateCacheKey];
[self.sectionDescriptor.formDescriptor removeObserversOfObject:self predicateType:XLPredicateTypeDisabled];
[self.sectionDescriptor.formDescriptor removeObserversOfObject:self predicateType:XLPredicateTypeHidden];
@try {
[self removeObserver:self forKeyPath:@"value"];
}
@catch (NSException * __unused exception) {}
@try {
[self removeObserver:self forKeyPath:@"disablePredicateCache"];
}
@catch (NSException * __unused exception) {}
@try {
[self removeObserver:self forKeyPath:@"hidePredicateCache"];
}
@catch (NSException * __unused exception) {}
_cell = nil;
[self.validators removeAllObjects];
self.validators = nil;
}
#pragma mark - KVO
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
if (!self.sectionDescriptor) return;
if (object == self && ([keyPath isEqualToString:@"value"] || [keyPath isEqualToString:@"hidePredicateCache"] || [keyPath isEqualToString:@"disablePredicateCache"])){
if (!self.sectionDescriptor) {
return;
}
else if (object == self && ([keyPath isEqualToString:XLValueKey] ||
[keyPath isEqualToString:XLHidePredicateCacheKey] || [keyPath isEqualToString:XLDisablePredicateCacheKey])) {
if ([[change objectForKey:NSKeyValueChangeKindKey] isEqualToNumber:@(NSKeyValueChangeSetting)]){
id newValue = [change objectForKey:NSKeyValueChangeNewKey];
id oldValue = [change objectForKey:NSKeyValueChangeOldKey];
if ([keyPath isEqualToString:@"value"]){
if ([keyPath isEqualToString:XLValueKey]) {
[self.sectionDescriptor.formDescriptor.delegate formRowDescriptorValueHasChanged:object oldValue:oldValue newValue:newValue];
if (self.onChangeBlock) {
self.onChangeBlock(oldValue, newValue, self);
}
}
else{
[self.sectionDescriptor.formDescriptor.delegate formRowDescriptorPredicateHasChanged:object oldValue:oldValue newValue:newValue predicateType:([keyPath isEqualToString:@"hidePredicateCache"] ? XLPredicateTypeHidden : XLPredicateTypeDisabled)];
else {
[self.sectionDescriptor.formDescriptor.delegate formRowDescriptorPredicateHasChanged:object
oldValue:oldValue
newValue:newValue
predicateType:([keyPath isEqualToString:XLHidePredicateCacheKey] ? XLPredicateTypeHidden : XLPredicateTypeDisabled)];
}
}
}
@@ -334,12 +374,14 @@ CGFloat XLFormRowInitialHeight = -2;
-(BOOL)isDisabled
{
if (self.sectionDescriptor.formDescriptor.isDisabled){
if (self.sectionDescriptor.formDescriptor.isDisabled) {
return YES;
}
if (self.isDirtyDisablePredicateCache) {
[self evaluateIsDisabled];
}
return [self.disablePredicateCache boolValue];
}
@@ -348,11 +390,12 @@ CGFloat XLFormRowInitialHeight = -2;
if ([_disabled isKindOfClass:[NSPredicate class]]){
[self.sectionDescriptor.formDescriptor removeObserversOfObject:self predicateType:XLPredicateTypeDisabled];
}
_disabled = [disabled isKindOfClass:[NSString class]] ? [disabled formPredicate] : disabled;
if ([_disabled isKindOfClass:[NSPredicate class]]){
[self.sectionDescriptor.formDescriptor addObserversOfObject:self predicateType:XLPredicateTypeDisabled];
}
[self evaluateIsDisabled];
}
@@ -361,7 +404,8 @@ CGFloat XLFormRowInitialHeight = -2;
if ([_disabled isKindOfClass:[NSPredicate class]]) {
if (!self.sectionDescriptor.formDescriptor) {
self.isDirtyDisablePredicateCache = YES;
} else {
}
else {
@try {
self.disablePredicateCache = @([_disabled evaluateWithObject:self substitutionVariables:self.sectionDescriptor.formDescriptor.allRowsByTag ?: @{}]);
}
@@ -371,12 +415,14 @@ CGFloat XLFormRowInitialHeight = -2;
};
}
}
else{
else {
self.disablePredicateCache = _disabled;
}
if ([self.disablePredicateCache boolValue]){
if ([self.disablePredicateCache boolValue]) {
[self.cell resignFirstResponder];
}
return [self.disablePredicateCache boolValue];
}
@@ -387,9 +433,9 @@ CGFloat XLFormRowInitialHeight = -2;
-(void)setDisablePredicateCache:(NSNumber*)disablePredicateCache
{
NSParameterAssert(disablePredicateCache);
NSParameterAssert(disablePredicateCache != nil);
self.isDirtyDisablePredicateCache = NO;
if (!_disablePredicateCache || ![_disablePredicateCache isEqualToNumber:disablePredicateCache]){
if (_disablePredicateCache == nil || ![_disablePredicateCache isEqualToNumber:disablePredicateCache]){
_disablePredicateCache = disablePredicateCache;
}
}
@@ -408,9 +454,9 @@ CGFloat XLFormRowInitialHeight = -2;
-(void)setHidePredicateCache:(NSNumber *)hidePredicateCache
{
NSParameterAssert(hidePredicateCache);
NSParameterAssert(hidePredicateCache != nil);
self.isDirtyHidePredicateCache = NO;
if (!_hidePredicateCache || ![_hidePredicateCache isEqualToNumber:hidePredicateCache]){
if (_hidePredicateCache == nil || ![_hidePredicateCache isEqualToNumber:hidePredicateCache]){
_hidePredicateCache = hidePredicateCache;
}
}
@@ -420,6 +466,7 @@ CGFloat XLFormRowInitialHeight = -2;
if (self.isDirtyHidePredicateCache) {
return [self evaluateIsHidden];
}
return [self.hidePredicateCache boolValue];
}
@@ -428,7 +475,8 @@ CGFloat XLFormRowInitialHeight = -2;
if ([_hidden isKindOfClass:[NSPredicate class]]) {
if (!self.sectionDescriptor.formDescriptor) {
self.isDirtyHidePredicateCache = YES;
} else {
}
else {
@try {
self.hidePredicateCache = @([_hidden evaluateWithObject:self substitutionVariables:self.sectionDescriptor.formDescriptor.allRowsByTag ?: @{}]);
}
@@ -438,16 +486,18 @@ CGFloat XLFormRowInitialHeight = -2;
};
}
}
else{
else {
self.hidePredicateCache = _hidden;
}
if ([self.hidePredicateCache boolValue]){
[self.cell resignFirstResponder];
[self.sectionDescriptor hideFormRow:self];
}
else{
else {
[self.sectionDescriptor showFormRow:self];
}
return [self.hidePredicateCache boolValue];
}
@@ -457,10 +507,12 @@ CGFloat XLFormRowInitialHeight = -2;
if ([_hidden isKindOfClass:[NSPredicate class]]){
[self.sectionDescriptor.formDescriptor removeObserversOfObject:self predicateType:XLPredicateTypeHidden];
}
_hidden = [hidden isKindOfClass:[NSString class]] ? [hidden formPredicate] : hidden;
if ([_hidden isKindOfClass:[NSPredicate class]]){
[self.sectionDescriptor.formDescriptor addObserversOfObject:self predicateType:XLPredicateTypeHidden];
}
[self evaluateIsHidden]; // check and update if this row should be hidden.
}
@@ -474,34 +526,35 @@ CGFloat XLFormRowInitialHeight = -2;
-(void)addValidator:(id<XLFormValidatorProtocol>)validator
{
if (validator == nil || ![validator conformsToProtocol:@protocol(XLFormValidatorProtocol)])
if (validator == nil || ![validator conformsToProtocol:@protocol(XLFormValidatorProtocol)]) {
return;
if(![self.validators containsObject:validator]) {
}
else if (![self.validators containsObject:validator]) {
[self.validators addObject:validator];
}
}
-(void)removeValidator:(id<XLFormValidatorProtocol>)validator
{
if (validator == nil|| ![validator conformsToProtocol:@protocol(XLFormValidatorProtocol)])
if (validator == nil || ![validator conformsToProtocol:@protocol(XLFormValidatorProtocol)]) {
return;
if ([self.validators containsObject:validator]) {
}
else if ([self.validators containsObject:validator]) {
[self.validators removeObject:validator];
}
}
- (BOOL)valueIsEmpty
{
return self.value == nil || [self.value isKindOfClass:[NSNull class]] || ([self.value respondsToSelector:@selector(length)] && [self.value length]==0) ||
([self.value respondsToSelector:@selector(count)] && [self.value count]==0);
return self.value == nil || [self.value isKindOfClass:[NSNull class]] ||
([self.value respondsToSelector:@selector(length)] && [self.value length] == 0) ||
([self.value respondsToSelector:@selector(count)] && [self.value count] == 0);
}
-(XLFormValidationStatus *)doValidation
{
XLFormValidationStatus *valStatus = nil;
if (self.required) {
// do required validation here
if ([self valueIsEmpty]) {
@@ -509,22 +562,24 @@ CGFloat XLFormRowInitialHeight = -2;
NSString *msg = nil;
if (self.requireMsg != nil) {
msg = self.requireMsg;
} else {
}
else {
// default message for required msg
msg = NSLocalizedString(@"%@ can't be empty", nil);
}
if (self.title != nil) {
if (self.title.length) {
valStatus.msg = [NSString stringWithFormat:msg, self.title];
} else {
}
else {
valStatus.msg = [NSString stringWithFormat:msg, self.tag];
}
return valStatus;
}
}
// custom validator
for(id<XLFormValidatorProtocol> v in self.validators) {
for (id<XLFormValidatorProtocol> v in self.validators) {
if ([v conformsToProtocol:@protocol(XLFormValidatorProtocol)]) {
XLFormValidationStatus *vStatus = [v isValid:self];
// fail validation
@@ -532,10 +587,12 @@ CGFloat XLFormRowInitialHeight = -2;
return vStatus;
}
valStatus = vStatus;
} else {
}
else {
valStatus = nil;
}
}
return valStatus;
}
@@ -591,13 +648,13 @@ CGFloat XLFormRowInitialHeight = -2;
-(instancetype)initWithLeftValue:(NSString *)leftValue httpParameterKey:(NSString *)httpParameterKey rightOptions:(NSArray *)rightOptions
{
self = [super init];
if (self){
if (self = [super init]) {
_selectorTitle = nil;
_leftValue = leftValue;
_rightOptions = rightOptions;
_httpParameterKey = httpParameterKey;
}
return self;
}
@@ -608,10 +665,10 @@ CGFloat XLFormRowInitialHeight = -2;
- (instancetype)init
{
self = [super init];
if (self) {
if (self = [super init]) {
_viewControllerPresentationMode = XLFormPresentationModeDefault;
}
return self;
}
@@ -623,24 +680,25 @@ CGFloat XLFormRowInitialHeight = -2;
if (self.viewControllerClass){
actionCopy.viewControllerClass = [self.viewControllerClass copy];
}
else if ([self.viewControllerStoryboardId length] != 0){
else if ([self.viewControllerStoryboardId length] != 0) {
actionCopy.viewControllerStoryboardId = [self.viewControllerStoryboardId copy];
}
else if ([self.viewControllerNibName length] != 0){
else if ([self.viewControllerNibName length] != 0) {
actionCopy.viewControllerNibName = [self.viewControllerNibName copy];
}
if (self.formBlock){
if (self.formBlock) {
actionCopy.formBlock = [self.formBlock copy];
}
else if (self.formSelector){
else if (self.formSelector) {
actionCopy.formSelector = self.formSelector;
}
else if (self.formSegueIdentifier){
else if (self.formSegueIdentifier) {
actionCopy.formSegueIdentifier = [self.formSegueIdentifier copy];
}
else if (self.formSegueClass){
actionCopy.formSegueClass = [self.formSegueClass copy];
}
return actionCopy;
}
@@ -665,7 +723,6 @@ CGFloat XLFormRowInitialHeight = -2;
_viewControllerStoryboardId = viewControllerStoryboardId;
}
-(void)setFormSelector:(SEL)formSelector
{
_formBlock = nil;
@@ -674,7 +731,6 @@ CGFloat XLFormRowInitialHeight = -2;
_formSelector = formSelector;
}
-(void)setFormBlock:(void (^)(XLFormRowDescriptor *))formBlock
{
_formSegueClass = nil;
@@ -30,14 +30,6 @@
@protocol XLFormRowDescriptorViewController <NSObject>
@required
@property (nonatomic) XLFormRowDescriptor * rowDescriptor;
@end
@protocol XLFormRowDescriptorPopoverViewController <NSObject>
@required
@property (nonatomic) UIPopoverController * popoverController;
@property (nonatomic, weak) XLFormRowDescriptor * rowDescriptor;
@end
@@ -27,8 +27,8 @@
@interface XLFormRowNavigationAccessoryView : UIToolbar
@property (nonatomic) UIBarButtonItem *previousButton;
@property (nonatomic) UIBarButtonItem *nextButton;
@property (nonatomic) UIBarButtonItem *doneButton;
@property (nonatomic, weak) UIBarButtonItem *previousButton;
@property (nonatomic, weak) UIBarButtonItem *nextButton;
@property (nonatomic, weak) UIBarButtonItem *doneButton;
@end
@@ -25,14 +25,6 @@
#import "XLFormRowNavigationAccessoryView.h"
@interface XLFormRowNavigationAccessoryView ()
@property (nonatomic) UIBarButtonItem *fixedSpace;
@property (nonatomic) UIBarButtonItem *flexibleSpace;
@end
@implementation XLFormRowNavigationAccessoryView
@synthesize previousButton = _previousButton;
@@ -44,55 +36,30 @@
{
self = [super initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, 44.0)];
if (self) {
UIBarButtonItem *previousButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:105 target:nil action:nil];
_previousButton = previousButton;
UIBarButtonItem *nextButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:106 target:nil action:nil];
_nextButton = nextButton;
UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:nil action:nil];
_doneButton = doneButton;
UIBarButtonItem *fixedSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil];
fixedSpace.width = 22.0;
UIBarButtonItem *flexibleSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
self.autoresizingMask = (UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleWidth);
NSArray * items = [NSArray arrayWithObjects:self.previousButton,
self.fixedSpace,
self.nextButton,
self.flexibleSpace,
self.doneButton, nil];
NSArray * items = [NSArray arrayWithObjects:previousButton,
fixedSpace,
nextButton,
flexibleSpace,
doneButton, nil];
[self setItems:items];
}
return self;
}
#pragma mark - Properties
-(UIBarButtonItem *)previousButton
{
if (_previousButton) return _previousButton;
_previousButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:105 target:nil action:nil];
return _previousButton;
}
-(UIBarButtonItem *)fixedSpace
{
if (_fixedSpace) return _fixedSpace;
_fixedSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil];
_fixedSpace.width = 22.0;
return _fixedSpace;
}
-(UIBarButtonItem *)nextButton
{
if (_nextButton) return _nextButton;
_nextButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:106 target:nil action:nil];
return _nextButton;
}
-(UIBarButtonItem *)flexibleSpace
{
if (_flexibleSpace) return _flexibleSpace;
_flexibleSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
return _flexibleSpace;
}
-(UIBarButtonItem *)doneButton
{
if (_doneButton) return _doneButton;
_doneButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:nil action:nil];
return _doneButton;
}
#pragma mark - Helpers
- (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent *)event
@@ -42,19 +42,19 @@ typedef NS_ENUM(NSUInteger, XLFormSectionInsertMode) {
@interface XLFormSectionDescriptor : NSObject
@property (nonatomic, nullable) NSString * title;
@property (nonatomic, nullable) NSString * footerTitle;
@property (readonly, nonnull) NSMutableArray * formRows;
@property (nonatomic, nullable, copy) NSString * title;
@property (nonatomic, nullable, copy) NSString * footerTitle;
@property (nonatomic, readonly, nonnull, strong) NSMutableArray * formRows;
@property (readonly) XLFormSectionInsertMode sectionInsertMode;
@property (readonly) XLFormSectionOptions sectionOptions;
@property (nullable) XLFormRowDescriptor * multivaluedRowTemplate;
@property (readonly, nullable) XLFormRowDescriptor * multivaluedAddButton;
@property (nonatomic, nullable) NSString * multivaluedTag;
@property (nonatomic, readonly, assign) XLFormSectionInsertMode sectionInsertMode;
@property (nonatomic, readonly, assign) XLFormSectionOptions sectionOptions;
@property (nonatomic, nullable, strong) XLFormRowDescriptor * multivaluedRowTemplate;
@property (nonatomic, readonly, nullable, strong) XLFormRowDescriptor * multivaluedAddButton;
@property (nonatomic, nullable, copy) NSString * multivaluedTag;
@property (weak, null_unspecified) XLFormDescriptor * formDescriptor;
@property (nonatomic, weak, null_unspecified) XLFormDescriptor * formDescriptor;
@property (nonnull) id hidden;
@property (nonatomic, nonnull, strong) id hidden;
-(BOOL)isHidden;
+(nonnull instancetype)formSection;
@@ -29,15 +29,16 @@
#import "NSString+XLFormAdditions.h"
#import "UIView+XLFormAdditions.h"
NSString * const XLFormRowsKey = @"formRows";
@interface XLFormDescriptor (_XLFormSectionDescriptor)
@property (readonly) NSDictionary* allRowsByTag;
@property (nonatomic, weak, readonly) NSDictionary *allRowsByTag;
-(void)addRowToTagCollection:(XLFormRowDescriptor*)rowDescriptor;
-(void)removeRowFromTagCollection:(XLFormRowDescriptor*) rowDescriptor;
-(void)showFormSection:(XLFormSectionDescriptor*)formSection;
-(void)hideFormSection:(XLFormSectionDescriptor*)formSection;
-(void)addRowToTagCollection:(XLFormRowDescriptor *)rowDescriptor;
-(void)removeRowFromTagCollection:(XLFormRowDescriptor *) rowDescriptor;
-(void)showFormSection:(XLFormSectionDescriptor *)formSection;
-(void)hideFormSection:(XLFormSectionDescriptor *)formSection;
-(void)addObserversOfObject:(id)sectionOrRow predicateType:(XLPredicateType)predicateType;
-(void)removeObserversOfObject:(id)sectionOrRow predicateType:(XLPredicateType)predicateType;
@@ -46,10 +47,11 @@
@interface XLFormSectionDescriptor()
@property NSMutableArray * formRows;
@property NSMutableArray * allRows;
@property BOOL isDirtyHidePredicateCache;
@property (nonatomic) NSNumber* hidePredicateCache;
@property (nonatomic, strong) NSMutableArray *formRows;
@property (nonatomic, strong) NSMutableArray *allRows;
@property (nonatomic, assign) BOOL isDirtyHidePredicateCache;
@property (nonatomic, copy ) NSNumber *hidePredicateCache;
@end
@@ -60,8 +62,7 @@
-(instancetype)init
{
self = [super init];
if (self){
if (self = [super init]) {
_formRows = [NSMutableArray array];
_allRows = [NSMutableArray array];
_sectionInsertMode = XLFormSectionInsertModeLastRow;
@@ -71,25 +72,35 @@
_hidden = @NO;
_hidePredicateCache = @NO;
_isDirtyHidePredicateCache = YES;
[self addObserver:self forKeyPath:@"formRows" options:(NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld) context:0];
[self addObserver:self
forKeyPath:XLFormRowsKey
options:(NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld) context:0];
}
return self;
}
-(instancetype)initWithTitle:(NSString *)title sectionOptions:(XLFormSectionOptions)sectionOptions sectionInsertMode:(XLFormSectionInsertMode)sectionInsertMode{
self = [self init];
if (self){
-(instancetype)initWithTitle:(NSString *)title sectionOptions:(XLFormSectionOptions)sectionOptions sectionInsertMode:(XLFormSectionInsertMode)sectionInsertMode
{
if (self = [self init]) {
_sectionInsertMode = sectionInsertMode;
_sectionOptions = sectionOptions;
_title = title;
if ([self canInsertUsingButton]){
_multivaluedAddButton = [XLFormRowDescriptor formRowDescriptorWithTag:nil rowType:XLFormRowDescriptorTypeButton title:@"Add Item"];
if ([self canInsertUsingButton]) {
_multivaluedAddButton = [XLFormRowDescriptor formRowDescriptorWithTag:nil
rowType:XLFormRowDescriptorTypeButton
title:@"Add Item"];
[_multivaluedAddButton.cellConfig setObject:@(NSTextAlignmentNatural) forKey:@"textLabel.textAlignment"];
_multivaluedAddButton.action.formSelector = NSSelectorFromString(@"multivaluedInsertButtonTapped:");
[self insertObject:_multivaluedAddButton inFormRowsAtIndex:0];
[self insertObject:_multivaluedAddButton inAllRowsAtIndex:0];
}
}
return self;
}
@@ -125,7 +136,13 @@
-(void)addFormRow:(XLFormRowDescriptor *)formRow
{
[self insertObject:formRow inAllRowsAtIndex:([self canInsertUsingButton] ? MAX(0, [self.formRows count] - 1) : [self.allRows count])];
NSUInteger index = [self.allRows count];
if ([self canInsertUsingButton]) {
index = ([self.formRows count] > 0) ? [self.formRows count] - 1 : 0;
}
[self insertObject:formRow inAllRowsAtIndex:index];
}
-(void)addFormRow:(XLFormRowDescriptor *)formRow afterRow:(XLFormRowDescriptor *)afterRow
@@ -136,26 +153,23 @@
}
else { //case when afterRow does not exist. Just insert at the end.
[self addFormRow:formRow];
return;
}
}
-(void)addFormRow:(XLFormRowDescriptor *)formRow beforeRow:(XLFormRowDescriptor *)beforeRow
{
NSUInteger allRowIndex = [self.allRows indexOfObject:beforeRow];
if (allRowIndex != NSNotFound) {
[self insertObject:formRow inAllRowsAtIndex:allRowIndex];
}
else { //case when afterRow does not exist. Just insert at the end.
[self addFormRow:formRow];
return;
}
}
-(void)removeFormRowAtIndex:(NSUInteger)index
{
if (self.formRows.count > index){
if (self.formRows.count > index) {
XLFormRowDescriptor *formRow = [self.formRows objectAtIndex:index];
NSUInteger allRowIndex = [self.allRows indexOfObject:formRow];
[self removeObjectFromFormRowsAtIndex:index];
@@ -166,21 +180,21 @@
-(void)removeFormRow:(XLFormRowDescriptor *)formRow
{
NSUInteger index = NSNotFound;
if ((index = [self.formRows indexOfObject:formRow]) != NSNotFound){
if ((index = [self.formRows indexOfObject:formRow]) != NSNotFound) {
[self removeFormRowAtIndex:index];
}
else if ((index = [self.allRows indexOfObject:formRow]) != NSNotFound){
if (self.allRows.count > index){
else if ((index = [self.allRows indexOfObject:formRow]) != NSNotFound) {
if (self.allRows.count > index) {
[self removeObjectFromAllRowsAtIndex:index];
}
};
}
}
- (void)moveRowAtIndexPath:(NSIndexPath *)sourceIndex toIndexPath:(NSIndexPath *)destinationIndex
{
if ((sourceIndex.row < self.formRows.count) && (destinationIndex.row < self.formRows.count) && (sourceIndex.row != destinationIndex.row)){
XLFormRowDescriptor * row = [self objectInFormRowsAtIndex:sourceIndex.row];
XLFormRowDescriptor * destRow = [self objectInFormRowsAtIndex:destinationIndex.row];
if ((sourceIndex.row < self.formRows.count) && (destinationIndex.row < self.formRows.count) && (sourceIndex.row != destinationIndex.row)) {
XLFormRowDescriptor *row = [self objectInFormRowsAtIndex:sourceIndex.row];
XLFormRowDescriptor *destRow = [self objectInFormRowsAtIndex:destinationIndex.row];
[self.formRows removeObjectAtIndex:sourceIndex.row];
[self.formRows insertObject:row atIndex:destinationIndex.row];
@@ -191,11 +205,15 @@
-(void)dealloc
{
[self removeObserver:self forKeyPath:XLFormRowsKey];
[self.formDescriptor removeObserversOfObject:self predicateType:XLPredicateTypeHidden];
@try {
[self removeObserver:self forKeyPath:@"formRows"];
}
@catch (NSException * __unused exception) {}
[self.formRows removeAllObjects];
self.formRows = nil;
[self.allRows removeAllObjects];
self.allRows = nil;
}
#pragma mark - Show/hide rows
@@ -206,13 +224,15 @@
if (formIndex != NSNotFound) {
return;
}
NSUInteger index = [self.allRows indexOfObject:formRow];
if (index != NSNotFound){
if (index != NSNotFound) {
while (formIndex == NSNotFound && index > 0) {
XLFormRowDescriptor* previous = [self.allRows objectAtIndex:--index];
formIndex = [self.formRows indexOfObject:previous];
}
if (formIndex == NSNotFound){ // index == 0 => insert at the beginning
if (formIndex == NSNotFound) { // index == 0 => insert at the beginning
[self insertObject:formRow inFormRowsAtIndex:0];
}
else {
@@ -224,36 +244,41 @@
-(void)hideFormRow:(XLFormRowDescriptor*)formRow{
NSUInteger index = [self.formRows indexOfObject:formRow];
if (index != NSNotFound){
if (index != NSNotFound) {
[self removeObjectFromFormRowsAtIndex:index];
}
}
#pragma mark - KVO
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
- (void)observeValueForKeyPath:(nullable NSString *)keyPath
ofObject:(nullable id)object
change:(nullable NSDictionary<NSKeyValueChangeKey, id> *)change
context:(nullable void *)context
{
if (!self.formDescriptor.delegate) return;
if ([keyPath isEqualToString:@"formRows"]){
if ([self.formDescriptor.formSections containsObject:self]){
if ([[change objectForKey:NSKeyValueChangeKindKey] isEqualToNumber:@(NSKeyValueChangeInsertion)]){
NSIndexSet * indexSet = [change objectForKey:NSKeyValueChangeIndexesKey];
XLFormRowDescriptor * formRow = [((XLFormSectionDescriptor *)object).formRows objectAtIndex:indexSet.firstIndex];
if (!self.formDescriptor.delegate) {
return;
}
else if ([keyPath isEqualToString:XLFormRowsKey]) {
if ([self.formDescriptor.formSections containsObject:self]) {
if ([[change objectForKey:NSKeyValueChangeKindKey] isEqualToNumber:@(NSKeyValueChangeInsertion)]) {
NSIndexSet *indexSet = [change objectForKey:NSKeyValueChangeIndexesKey];
XLFormRowDescriptor *formRow = [((XLFormSectionDescriptor *)object).formRows objectAtIndex:indexSet.firstIndex];
NSUInteger sectionIndex = [self.formDescriptor.formSections indexOfObject:object];
[self.formDescriptor.delegate formRowHasBeenAdded:formRow atIndexPath:[NSIndexPath indexPathForRow:indexSet.firstIndex inSection:sectionIndex]];
[self.formDescriptor.delegate formRowHasBeenAdded:formRow
atIndexPath:[NSIndexPath indexPathForRow:indexSet.firstIndex inSection:sectionIndex]];
}
else if ([[change objectForKey:NSKeyValueChangeKindKey] isEqualToNumber:@(NSKeyValueChangeRemoval)]){
NSIndexSet * indexSet = [change objectForKey:NSKeyValueChangeIndexesKey];
XLFormRowDescriptor * removedRow = [[change objectForKey:NSKeyValueChangeOldKey] objectAtIndex:0];
else if ([[change objectForKey:NSKeyValueChangeKindKey] isEqualToNumber:@(NSKeyValueChangeRemoval)]) {
NSIndexSet *indexSet = [change objectForKey:NSKeyValueChangeIndexesKey];
XLFormRowDescriptor *removedRow = [[change objectForKey:NSKeyValueChangeOldKey] objectAtIndex:0];
NSUInteger sectionIndex = [self.formDescriptor.formSections indexOfObject:object];
[self.formDescriptor.delegate formRowHasBeenRemoved:removedRow atIndexPath:[NSIndexPath indexPathForRow:indexSet.firstIndex inSection:sectionIndex]];
[self.formDescriptor.delegate formRowHasBeenRemoved:removedRow
atIndexPath:[NSIndexPath indexPathForRow:indexSet.firstIndex inSection:sectionIndex]];
}
}
}
}
#pragma mark - KVC
-(NSUInteger)countOfFormRows
@@ -334,9 +359,9 @@
-(void)setHidePredicateCache:(NSNumber *)hidePredicateCache
{
NSParameterAssert(hidePredicateCache);
NSParameterAssert(hidePredicateCache != nil);
self.isDirtyHidePredicateCache = NO;
if (!_hidePredicateCache || ![_hidePredicateCache isEqualToNumber:hidePredicateCache]){
if (_hidePredicateCache == nil || ![_hidePredicateCache isEqualToNumber:hidePredicateCache]) {
_hidePredicateCache = hidePredicateCache;
}
}
@@ -346,6 +371,7 @@
if (self.isDirtyHidePredicateCache) {
return [self evaluateIsHidden];
}
return [self.hidePredicateCache boolValue];
}
@@ -354,7 +380,8 @@
if ([_hidden isKindOfClass:[NSPredicate class]]) {
if (!self.formDescriptor) {
self.isDirtyHidePredicateCache = YES;
} else {
}
else {
@try {
self.hidePredicateCache = @([_hidden evaluateWithObject:self substitutionVariables:self.formDescriptor.allRowsByTag ?: @{}]);
}
@@ -364,21 +391,24 @@
};
}
}
else{
else {
self.hidePredicateCache = _hidden;
}
if ([self.hidePredicateCache boolValue]){
if ([self.formDescriptor.delegate isKindOfClass:[XLFormViewController class]]){
XLFormBaseCell* firtResponder = (XLFormBaseCell*) [((XLFormViewController*)self.formDescriptor.delegate).tableView findFirstResponder];
if ([firtResponder isKindOfClass:[XLFormBaseCell class]] && firtResponder.rowDescriptor.sectionDescriptor == self){
if ([self.hidePredicateCache boolValue]) {
if ([self.formDescriptor.delegate isKindOfClass:[XLFormViewController class]]) {
XLFormBaseCell *firtResponder = (XLFormBaseCell *)[((XLFormViewController *)self.formDescriptor.delegate).tableView findFirstResponder];
if ([firtResponder isKindOfClass:[XLFormBaseCell class]] && firtResponder.rowDescriptor.sectionDescriptor == self) {
[firtResponder resignFirstResponder];
}
}
[self.formDescriptor hideFormSection:self];
}
else{
else {
[self.formDescriptor showFormSection:self];
}
return [self.hidePredicateCache boolValue];
}
@@ -390,13 +420,15 @@
-(void)setHidden:(id)hidden
{
if ([_hidden isKindOfClass:[NSPredicate class]]){
if ([_hidden isKindOfClass:[NSPredicate class]]) {
[self.formDescriptor removeObserversOfObject:self predicateType:XLPredicateTypeHidden];
}
_hidden = [hidden isKindOfClass:[NSString class]] ? [hidden formPredicate] : hidden;
if ([_hidden isKindOfClass:[NSPredicate class]]){
if ([_hidden isKindOfClass:[NSPredicate class]]) {
[self.formDescriptor addObserversOfObject:self predicateType:XLPredicateTypeHidden];
}
[self evaluateIsHidden]; // check and update if this row should be hidden.
}

Some files were not shown because too many files have changed in this diff Show More