Compare commits
28 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 3dd39ed7bc | |||
| 45d363fb0c | |||
| 21f97ce9a6 | |||
| f2383b7903 | |||
| 6ac31155f8 | |||
| 151003d8e5 | |||
| b5bdda8e80 | |||
| 81aca9c49c | |||
| d8ece1410d | |||
| fdca5f7543 | |||
| 204cad6045 | |||
| e68b57cded | |||
| 0bc600d5a7 | |||
| c2d721f098 | |||
| 2485332846 | |||
| 20b661c41e | |||
| 1e2b5137d6 | |||
| 43abac5c3f | |||
| 77db6b9492 | |||
| 74b26c1e64 | |||
| 085cf31e52 | |||
| 313e5d5d40 | |||
| f7777d9d27 | |||
| 578dea99dd | |||
| 1da30107dc | |||
| 4674c3abaf | |||
| 5ca54fd949 | |||
| e64e5b4885 |
+2
-4
@@ -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
-3
@@ -1,8 +1,8 @@
|
||||
language: objective-c
|
||||
osx_image: xcode7.2
|
||||
osx_image: xcode11
|
||||
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
|
||||
|
||||
|
||||
+15
-1
@@ -1,6 +1,20 @@
|
||||
# Change Log
|
||||
All notable changes to this project will be documented in this file.
|
||||
|
||||
### 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`
|
||||
@@ -134,4 +148,4 @@ All notable changes to this project will be documented in this file.
|
||||
|
||||
### Version 1.0.0
|
||||
|
||||
* Initial release
|
||||
* Initial release
|
||||
|
||||
@@ -57,6 +57,7 @@ NSString *const kCountDownTimer = @"countDownTimer";
|
||||
// Date
|
||||
row = [XLFormRowDescriptor formRowDescriptorWithTag:kDateInline rowType:XLFormRowDescriptorTypeDateInline title:@"Date"];
|
||||
row.value = [NSDate new];
|
||||
[row.cellConfigAtConfigure setObject:[NSLocale localeWithLocaleIdentifier:@"FR_fr" ] forKey:@"locale"];
|
||||
[section addFormRow:row];
|
||||
|
||||
// Time
|
||||
@@ -153,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
|
||||
|
||||
@@ -105,6 +105,11 @@
|
||||
[row.cellConfigAtConfigure setObject:@(NSTextAlignmentRight) forKey:@"textField.textAlignment"];
|
||||
[section addFormRow:row];
|
||||
|
||||
row = [XLFormRowDescriptor formRowDescriptorWithTag:@"megabytes" rowType:XLFormRowDescriptorTypeInfo title:@"Megabytes"];
|
||||
row.valueFormatter = [NSByteCountFormatter new];
|
||||
row.value = @(1024);
|
||||
[section addFormRow:row];
|
||||
|
||||
section = [XLFormSectionDescriptor formSection];
|
||||
[formDescriptor addFormSection:section];
|
||||
|
||||
@@ -112,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];
|
||||
}
|
||||
|
||||
+1
-1
@@ -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>
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -43,7 +43,7 @@ PODS:
|
||||
- XLData/RemoteDataStore (2.0.0):
|
||||
- XLData/CoreRemote
|
||||
- XLData/DataStore
|
||||
- XLForm (3.1.2)
|
||||
- XLForm (4.0.1)
|
||||
|
||||
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: b8d47a9a00fb6166981cb40de7169d70d611e9be
|
||||
|
||||
PODFILE CHECKSUM: 80615792e859be64c95add3bb57c1596234faf95
|
||||
PODFILE CHECKSUM: 64fbcd03a2c13762b2c18e3938cc8008807937c9
|
||||
|
||||
COCOAPODS: 1.0.0
|
||||
COCOAPODS: 1.7.1
|
||||
|
||||
@@ -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,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 = 1100;
|
||||
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,27 @@
|
||||
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;
|
||||
@@ -546,7 +545,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 +558,27 @@
|
||||
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;
|
||||
@@ -586,7 +594,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 +605,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 +614,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 +630,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
|
||||
|
||||
+3
-3
@@ -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()
|
||||
}
|
||||
|
||||
+5
-5
@@ -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 {
|
||||
|
||||
+3
-3
@@ -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)
|
||||
@@ -76,6 +76,7 @@ class DatesFormViewController: XLFormViewController {
|
||||
// Date
|
||||
row = XLFormRowDescriptor(tag: Tags.DateInline, rowType: XLFormRowDescriptorTypeDateInline, title:"Date")
|
||||
row.value = Date()
|
||||
row.cellConfigAtConfigure["locale"] = Locale(identifier: "FR_fr")
|
||||
section.addFormRow(row)
|
||||
|
||||
// Time
|
||||
@@ -140,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)
|
||||
|
||||
@@ -153,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)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+30
-27
@@ -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")
|
||||
}
|
||||
|
||||
@@ -6,7 +6,9 @@ By [XMARTLABS](http://xmartlabs.com).
|
||||
[](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 looking for Swift native implementation we have recently created [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
|
||||
--------------
|
||||
@@ -15,7 +17,7 @@ XLForm is the most flexible and powerful iOS library to create dynamic table-vie
|
||||
|
||||
XLForm provides a very powerful DSL (Domain Specific Language) used to create a form. It keeps track of this specification on runtime, updating the UI on the fly.
|
||||
|
||||
#####Let's see the iOS Calendar Event Form created using XLForm
|
||||
##### Let's see the iOS Calendar Event Form created using XLForm
|
||||
|
||||
|
||||

|
||||
@@ -182,7 +184,7 @@ How to run XLForm examples
|
||||
|
||||
Rows
|
||||
---------------------
|
||||
####Input Rows
|
||||
#### Input Rows
|
||||
|
||||

|
||||
|
||||
@@ -253,7 +255,7 @@ Will be represented by a `UITextView` with `UITextAutocorrectionTypeDefault`, `U
|
||||
|
||||
|
||||
|
||||
####Selector Rows
|
||||
#### Selector Rows
|
||||
|
||||
Selector rows allow us to select a value or values from a list. XLForm supports 8 types of selectors out of the box:
|
||||
|
||||
@@ -320,7 +322,7 @@ This is the protocol declaration:
|
||||
```
|
||||
|
||||
|
||||
####Date & Time Rows
|
||||
#### Date & Time Rows
|
||||
|
||||
XLForms supports 3 types of dates: `Date`, `DateTime` , `Time` and `Countdown Timer` and it's able to present the `UIDatePicker` control in 2 different ways, inline and non-inline.
|
||||
|
||||
@@ -427,7 +429,7 @@ section.addFormRow(row)
|
||||
self.form = form;
|
||||
|
||||
```
|
||||
####Boolean Rows
|
||||
#### Boolean Rows
|
||||
|
||||
XLForms supports 2 types of boolean controls:
|
||||
|
||||
@@ -445,9 +447,9 @@ static NSString *const XLFormRowDescriptorTypeBooleanSwitch = @"booleanSwitch";
|
||||
We can also simulate other types of Boolean rows using any of the Selector Row Types introduced in the [Selector Rows section](#selector-rows).
|
||||
|
||||
|
||||
####Other Rows
|
||||
#### Other Rows
|
||||
|
||||
#####Stepper
|
||||
##### Stepper
|
||||
|
||||
XLForms supports counting using UIStepper control:
|
||||
|
||||
@@ -469,7 +471,7 @@ You can set the stepper paramaters easily:
|
||||
[row.cellConfigAtConfigure setObject:@100 forKey:@"stepControl.maximumValue"];
|
||||
```
|
||||
|
||||
#####Slider
|
||||
##### Slider
|
||||
|
||||
XLForms supports counting using UISlider control:
|
||||
|
||||
@@ -490,11 +492,11 @@ You can adjust the slider for your own interests very easily:
|
||||
|
||||
Set `steps` to `@(0)` to disable the steps functionality.
|
||||
|
||||
#####Info
|
||||
##### 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.
|
||||
|
||||
#####Button
|
||||
##### Button
|
||||
|
||||
Apart from data entry rows, not editable rows and selectors, XLForm has a button row `XLFormRowDescriptorTypeButton` that allows us to do any action when selected. It can be configured using a block (clousure), a selector, a segue identifier, segue class or specifing a view controller to be presented. ViewController specification could be done by setting up the view controller class, the view controller storyboard Id or a nib name. Nib name must match view controller class name.
|
||||
|
||||
@@ -767,7 +769,7 @@ For instance if we want to show or hide a row depending on the value of another
|
||||
Make a row or section invisible depending on other rows values
|
||||
--------------------------------
|
||||
|
||||
###Summary
|
||||
### Summary
|
||||
|
||||
XLForm allows you to define dependencies between rows so that if the value of one row is changed, the behaviour of another one changes automatically. For example, you might have a form where you question the user if he/she has pets. If the answer is 'yes' you might want to ask how their names are.
|
||||
So you can make a row invisible and visible again based on the values of other rows. The same happens with sections.
|
||||
@@ -777,7 +779,7 @@ Take a look at the following example:
|
||||
|
||||
Of course, you could also do this manually by observing the value of some rows and deleting and adding rows accordingly, but that would be a lot of work which is already done.
|
||||
|
||||
###How it works
|
||||
### How it works
|
||||
|
||||
To make the appearance and disappearance of rows and sections automatic, there is a property in each descriptor:
|
||||
|
||||
@@ -897,6 +899,25 @@ section.addFormRow(row)
|
||||
FAQ
|
||||
-------
|
||||
|
||||
#### How to customize the header and/or footer of a section
|
||||
|
||||
For this you should use the UITableViewDelegate methods in your XLFormViewController.
|
||||
This means you should implement one or both of these:
|
||||
|
||||
```objc
|
||||
-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
|
||||
|
||||
-(UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
|
||||
```
|
||||
|
||||
Also you might want to implement the following methods to specify the height for these views:
|
||||
|
||||
```objc
|
||||
-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
|
||||
|
||||
-(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
|
||||
```
|
||||
|
||||
#### How to assign the first responder on form appearance
|
||||
|
||||
Assign the first responder when the form is shown is as simple as setting the property `assignFirstResponderOnShow` to `YES`. By default the value of the property is `NO`.
|
||||
@@ -1008,7 +1029,7 @@ row.cellConfig.setObject(UIFont(name: "AppleSDGothicNeo-Regular", size: 17)!, fo
|
||||
|
||||
For further details, please take a look at [UICustomizationFormViewController.m](/Examples/Objective-C/Examples/UICustomization/UICustomizationFormViewController.m) example.
|
||||
|
||||
####How to set min/max for date cells?
|
||||
#### How to set min/max for date cells?
|
||||
|
||||
Each XLFormDateCell has a `minimumDate` and a `maximumDate` property. To set a datetime row to be a value in the next three days you would do as follows:
|
||||
|
||||
@@ -1107,7 +1128,7 @@ Installation
|
||||
## CocoaPods
|
||||
|
||||
1. Add the following line in the project's Podfile file:
|
||||
`pod 'XLForm', '~> 3.0'`.
|
||||
`pod 'XLForm', '~> 4.1'`.
|
||||
2. Run the command `pod install` from the Podfile folder directory.
|
||||
|
||||
XLForm **has no** dependencies over other pods.
|
||||
@@ -1137,7 +1158,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.1
|
||||
```
|
||||
|
||||
## Using git submodules
|
||||
@@ -1160,8 +1181,8 @@ Requirements
|
||||
-----------------------------
|
||||
|
||||
* ARC
|
||||
* iOS 7.0 and above
|
||||
* XCode 6.3+
|
||||
* iOS 9.0 and above
|
||||
* XCode 9.0+
|
||||
|
||||
|
||||
Release Notes
|
||||
|
||||
@@ -3,7 +3,7 @@ include FileUtils::Verbose
|
||||
namespace :test do
|
||||
desc "Run the XLForm Tests"
|
||||
task :ios do
|
||||
run_tests('XLForm Tests', 'iphonesimulator9.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 'name=iPhone 6' -configuration Release clean test | xcpretty -c ; exit ${PIPESTATUS[0]}") rescue nil
|
||||
sh("xcodebuild -workspace 'Tests/XLForm Tests.xcworkspace' -scheme '#{scheme}' -sdk '#{sdk}' -destination 'OS=13.0,name=iPhone 8' -configuration Release clean test | xcpretty -c ; exit ${PIPESTATUS[0]}") rescue nil
|
||||
end
|
||||
|
||||
def tests_failed
|
||||
|
||||
+3
-2
@@ -2,8 +2,9 @@ source 'https://github.com/CocoaPods/Specs.git'
|
||||
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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
@@ -1,6 +1,6 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'XLForm'
|
||||
s.version = '3.3.0'
|
||||
s.version = '4.1.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
|
||||
|
||||
@@ -414,7 +414,7 @@
|
||||
E267FD171BE8048900F86B42 /* Project object */ = {
|
||||
isa = PBXProject;
|
||||
attributes = {
|
||||
LastUpgradeCheck = 0710;
|
||||
LastUpgradeCheck = 0940;
|
||||
ORGANIZATIONNAME = XLForm;
|
||||
TargetAttributes = {
|
||||
E267FD1F1BE8048900F86B42 = {
|
||||
@@ -505,13 +505,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";
|
||||
@@ -534,7 +544,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 +562,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";
|
||||
@@ -575,7 +595,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 +608,7 @@
|
||||
E267FD291BE8048900F86B42 /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
|
||||
DEFINES_MODULE = YES;
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
DYLIB_CURRENT_VERSION = 1;
|
||||
@@ -604,6 +625,7 @@
|
||||
E267FD2A1BE8048900F86B42 /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
|
||||
DEFINES_MODULE = YES;
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
DYLIB_CURRENT_VERSION = 1;
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -42,8 +42,8 @@
|
||||
|
||||
@protocol XLFormReturnKeyProtocol
|
||||
|
||||
@property UIReturnKeyType returnKeyType;
|
||||
@property UIReturnKeyType nextReturnKeyType;
|
||||
@property (nonatomic, assign) UIReturnKeyType returnKeyType;
|
||||
@property (nonatomic, assign) UIReturnKeyType nextReturnKeyType;
|
||||
|
||||
@end
|
||||
|
||||
|
||||
Regular → Executable
+26
-1
@@ -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
|
||||
|
||||
Regular → Executable
+13
-3
@@ -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)];
|
||||
|
||||
@@ -34,10 +34,10 @@ typedef NS_ENUM(NSUInteger, XLFormDateDatePickerMode) {
|
||||
|
||||
@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, copy ) NSDate *minimumDate;
|
||||
@property (nonatomic, copy ) NSDate *maximumDate;
|
||||
@property (nonatomic, assign) NSInteger minuteInterval;
|
||||
@property (nonatomic, copy ) NSLocale *locale;
|
||||
|
||||
@end
|
||||
|
||||
@@ -37,6 +37,7 @@
|
||||
@implementation XLFormDateCell
|
||||
{
|
||||
UIColor * _beforeChangeColor;
|
||||
NSDateFormatter *_dateFormatter;
|
||||
}
|
||||
|
||||
|
||||
@@ -109,6 +110,7 @@
|
||||
{
|
||||
[super configure];
|
||||
self.formDatePickerMode = XLFormDateDatePickerModeGetFromRowDescriptor;
|
||||
_dateFormatter = [[NSDateFormatter alloc] init];
|
||||
}
|
||||
|
||||
-(void)update
|
||||
@@ -173,10 +175,14 @@
|
||||
}
|
||||
}
|
||||
if ([self.rowDescriptor.rowType isEqualToString:XLFormRowDescriptorTypeDate] || [self.rowDescriptor.rowType isEqualToString:XLFormRowDescriptorTypeDateInline]){
|
||||
return [NSDateFormatter localizedStringFromDate:date dateStyle:NSDateFormatterMediumStyle timeStyle:NSDateFormatterNoStyle];
|
||||
_dateFormatter.dateStyle = NSDateFormatterMediumStyle;
|
||||
_dateFormatter.timeStyle = NSDateFormatterNoStyle;
|
||||
return [_dateFormatter stringFromDate:date];
|
||||
}
|
||||
else if ([self.rowDescriptor.rowType isEqualToString:XLFormRowDescriptorTypeTime] || [self.rowDescriptor.rowType isEqualToString:XLFormRowDescriptorTypeTimeInline]){
|
||||
return [NSDateFormatter localizedStringFromDate:date dateStyle:NSDateFormatterNoStyle timeStyle:NSDateFormatterShortStyle];
|
||||
_dateFormatter.dateStyle = NSDateFormatterNoStyle;
|
||||
_dateFormatter.timeStyle = NSDateFormatterShortStyle;
|
||||
return [_dateFormatter stringFromDate:date];
|
||||
}
|
||||
else if ([self.rowDescriptor.rowType isEqualToString:XLFormRowDescriptorTypeCountDownTimer] || [self.rowDescriptor.rowType isEqualToString:XLFormRowDescriptorTypeCountDownTimerInline]){
|
||||
NSCalendar *calendar = [NSCalendar currentCalendar];
|
||||
@@ -184,7 +190,9 @@
|
||||
NSDateComponents *time = [calendar components:NSCalendarUnitHour | NSCalendarUnitMinute fromDate:date];
|
||||
return [NSString stringWithFormat:@"%ld%@ %ldmin", (long)[time hour], (long)[time hour] == 1 ? @"hour" : @"hours", (long)[time minute]];
|
||||
}
|
||||
return [NSDateFormatter localizedStringFromDate:date dateStyle:NSDateFormatterShortStyle timeStyle:NSDateFormatterShortStyle];
|
||||
_dateFormatter.dateStyle = NSDateFormatterShortStyle;
|
||||
_dateFormatter.timeStyle = NSDateFormatterShortStyle;
|
||||
return [_dateFormatter stringFromDate:date];
|
||||
}
|
||||
|
||||
-(void)setModeToDatePicker:(UIDatePicker *)datePicker
|
||||
@@ -228,6 +236,11 @@
|
||||
return _datePicker;
|
||||
}
|
||||
|
||||
-(void)setLocale:(NSLocale *)locale
|
||||
{
|
||||
_locale = locale;
|
||||
_dateFormatter.locale = locale;
|
||||
}
|
||||
|
||||
#pragma mark - Target Action
|
||||
|
||||
|
||||
@@ -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}]];
|
||||
}
|
||||
|
||||
@@ -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,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}]];
|
||||
}
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
|
||||
@interface XLFormSegmentedCell()
|
||||
|
||||
@property NSMutableArray * dynamicCustomConstraints;
|
||||
@property (nonatomic, strong) NSMutableArray * dynamicCustomConstraints;
|
||||
|
||||
@end
|
||||
|
||||
@@ -168,6 +168,9 @@
|
||||
-(void)dealloc
|
||||
{
|
||||
[self.textLabel removeObserver:self forKeyPath:@"text"];
|
||||
|
||||
[self.dynamicCustomConstraints removeAllObjects];
|
||||
self.dynamicCustomConstraints = nil;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@@ -29,10 +29,9 @@
|
||||
#import "XLFormSelectorCell.h"
|
||||
#import "NSArray+XLFormAdditions.h"
|
||||
|
||||
@interface XLFormSelectorCell() <UIActionSheetDelegate, UIPickerViewDelegate, UIPickerViewDataSource, UIPopoverControllerDelegate>
|
||||
@interface XLFormSelectorCell() <UIPickerViewDelegate, UIPickerViewDataSource, UIPopoverPresentationControllerDelegate>
|
||||
|
||||
@property (nonatomic) UIPickerView * pickerView;
|
||||
@property (nonatomic) UIPopoverController *popoverController;
|
||||
|
||||
@end
|
||||
|
||||
@@ -87,7 +86,7 @@
|
||||
return tranformedValue;
|
||||
}
|
||||
}
|
||||
return [self.rowDescriptor.value displayText];
|
||||
return self.rowDescriptor.displayTextValue;
|
||||
}
|
||||
|
||||
|
||||
@@ -168,21 +167,28 @@
|
||||
selectorViewController.title = self.rowDescriptor.selectorTitle;
|
||||
|
||||
if ([self.rowDescriptor.rowType isEqualToString:XLFormRowDescriptorTypeSelectorPopover]) {
|
||||
if (self.popoverController && self.popoverController.popoverVisible) {
|
||||
[self.popoverController dismissPopoverAnimated:NO];
|
||||
}
|
||||
self.popoverController = [[UIPopoverController alloc] initWithContentViewController:selectorViewController];
|
||||
self.popoverController.delegate = self;
|
||||
if ([selectorViewController conformsToProtocol:@protocol(XLFormRowDescriptorPopoverViewController)]){
|
||||
((id<XLFormRowDescriptorPopoverViewController>)selectorViewController).popoverController = self.popoverController;
|
||||
UIViewController *popoverController = self.formViewController.presentedViewController;
|
||||
if (popoverController && popoverController.modalPresentationStyle == UIModalPresentationPopover) {
|
||||
[self.formViewController dismissViewControllerAnimated:NO completion:nil];
|
||||
}
|
||||
selectorViewController.modalPresentationStyle = UIModalPresentationPopover;
|
||||
|
||||
selectorViewController.popoverPresentationController.delegate = self;
|
||||
if (self.detailTextLabel.window){
|
||||
[self.popoverController presentPopoverFromRect:CGRectMake(0, 0, self.detailTextLabel.frame.size.width, self.detailTextLabel.frame.size.height) inView:self.detailTextLabel permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
|
||||
selectorViewController.popoverPresentationController.sourceRect = CGRectMake(0, 0, self.detailTextLabel.frame.size.width, self.detailTextLabel.frame.size.height);
|
||||
selectorViewController.popoverPresentationController.sourceView = self.detailTextLabel;
|
||||
selectorViewController.popoverPresentationController.permittedArrowDirections = UIPopoverArrowDirectionAny;
|
||||
} else {
|
||||
selectorViewController.popoverPresentationController.sourceRect = CGRectMake(0, 0, self.frame.size.width, self.frame.size.height);
|
||||
selectorViewController.popoverPresentationController.sourceView = self;
|
||||
selectorViewController.popoverPresentationController.permittedArrowDirections = UIPopoverArrowDirectionAny;
|
||||
}
|
||||
else{
|
||||
[self.popoverController presentPopoverFromRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height) inView:self permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
|
||||
}
|
||||
[controller.tableView deselectRowAtIndexPath:[controller.tableView indexPathForCell:self] animated:YES];
|
||||
|
||||
[self.formViewController presentViewController:selectorViewController
|
||||
animated:YES
|
||||
completion:nil];
|
||||
[controller.tableView deselectRowAtIndexPath:[controller.tableView indexPathForCell:self]
|
||||
animated:YES];
|
||||
}
|
||||
else {
|
||||
[controller.navigationController pushViewController:selectorViewController animated:YES];
|
||||
@@ -194,16 +200,24 @@
|
||||
optionsViewController.title = self.rowDescriptor.selectorTitle;
|
||||
|
||||
if ([self.rowDescriptor.rowType isEqualToString:XLFormRowDescriptorTypeSelectorPopover]) {
|
||||
self.popoverController = [[UIPopoverController alloc] initWithContentViewController:optionsViewController];
|
||||
self.popoverController.delegate = self;
|
||||
optionsViewController.popoverController = self.popoverController;
|
||||
optionsViewController.modalPresentationStyle = UIModalPresentationPopover;
|
||||
|
||||
optionsViewController.popoverPresentationController.delegate = self;
|
||||
if (self.detailTextLabel.window){
|
||||
[self.popoverController presentPopoverFromRect:CGRectMake(0, 0, self.detailTextLabel.frame.size.width, self.detailTextLabel.frame.size.height) inView:self.detailTextLabel permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
|
||||
optionsViewController.popoverPresentationController.sourceRect = CGRectMake(0, 0, self.detailTextLabel.frame.size.width, self.detailTextLabel.frame.size.height);
|
||||
optionsViewController.popoverPresentationController.sourceView = self.detailTextLabel;
|
||||
optionsViewController.popoverPresentationController.permittedArrowDirections = UIPopoverArrowDirectionAny;
|
||||
} else {
|
||||
optionsViewController.popoverPresentationController.sourceRect = CGRectMake(0, 0, self.frame.size.width, self.frame.size.height);
|
||||
optionsViewController.popoverPresentationController.sourceView = self;
|
||||
optionsViewController.popoverPresentationController.permittedArrowDirections = UIPopoverArrowDirectionAny;
|
||||
}
|
||||
else{
|
||||
[self.popoverController presentPopoverFromRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height) inView:self permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
|
||||
}
|
||||
[controller.tableView deselectRowAtIndexPath:[controller.tableView indexPathForCell:self] animated:YES];
|
||||
|
||||
[self.formViewController presentViewController:optionsViewController
|
||||
animated:YES
|
||||
completion:nil];
|
||||
[controller.tableView deselectRowAtIndexPath:[controller.tableView indexPathForCell:self]
|
||||
animated:YES];
|
||||
} else {
|
||||
[controller.navigationController pushViewController:optionsViewController animated:YES];
|
||||
}
|
||||
@@ -223,135 +237,76 @@
|
||||
optionsViewController.title = self.rowDescriptor.selectorTitle;
|
||||
|
||||
if ([self.rowDescriptor.rowType isEqualToString:XLFormRowDescriptorTypeMultipleSelectorPopover]) {
|
||||
self.popoverController = [[UIPopoverController alloc] initWithContentViewController:optionsViewController];
|
||||
self.popoverController.delegate = self;
|
||||
optionsViewController.popoverController = self.popoverController;
|
||||
optionsViewController.modalPresentationStyle = UIModalPresentationPopover;
|
||||
|
||||
optionsViewController.popoverPresentationController.delegate = self;
|
||||
if (self.detailTextLabel.window){
|
||||
[self.popoverController presentPopoverFromRect:CGRectMake(0, 0, self.detailTextLabel.frame.size.width, self.detailTextLabel.frame.size.height) inView:self.detailTextLabel permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
|
||||
}
|
||||
else{
|
||||
[self.popoverController presentPopoverFromRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height) inView:self permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
|
||||
optionsViewController.popoverPresentationController.sourceRect = CGRectMake(0, 0, self.detailTextLabel.frame.size.width, self.detailTextLabel.frame.size.height);
|
||||
optionsViewController.popoverPresentationController.sourceView = self.detailTextLabel;
|
||||
optionsViewController.popoverPresentationController.permittedArrowDirections = UIPopoverArrowDirectionAny;
|
||||
} else {
|
||||
optionsViewController.popoverPresentationController.sourceRect = CGRectMake(0, 0, self.frame.size.width, self.frame.size.height);
|
||||
optionsViewController.popoverPresentationController.sourceView = self;
|
||||
optionsViewController.popoverPresentationController.permittedArrowDirections = UIPopoverArrowDirectionAny;
|
||||
}
|
||||
|
||||
[self.formViewController presentViewController:optionsViewController
|
||||
animated:YES
|
||||
completion:nil];
|
||||
[controller.tableView deselectRowAtIndexPath:[controller.tableView indexPathForCell:self] animated:YES];
|
||||
} else {
|
||||
[controller.navigationController pushViewController:optionsViewController animated:YES];
|
||||
}
|
||||
}
|
||||
else if ([self.rowDescriptor.rowType isEqualToString:XLFormRowDescriptorTypeSelectorActionSheet]){
|
||||
|
||||
|
||||
#if __IPHONE_OS_VERSION_MAX_ALLOWED < 80000
|
||||
UIActionSheet * actionSheet = [[UIActionSheet alloc] initWithTitle:self.rowDescriptor.selectorTitle
|
||||
delegate:self
|
||||
cancelButtonTitle:nil
|
||||
destructiveButtonTitle:nil
|
||||
otherButtonTitles:nil];
|
||||
XLFormViewController * formViewController = self.formViewController;
|
||||
UIAlertController * alertController = [UIAlertController alertControllerWithTitle:self.rowDescriptor.selectorTitle
|
||||
message:nil
|
||||
preferredStyle:UIAlertControllerStyleActionSheet];
|
||||
[alertController addAction:[UIAlertAction actionWithTitle:NSLocalizedString(@"Cancel", nil)
|
||||
style:UIAlertActionStyleCancel
|
||||
handler:nil]];
|
||||
alertController.popoverPresentationController.sourceView = formViewController.tableView;
|
||||
UIView* v = (self.detailTextLabel ?: self.textLabel) ?: self.contentView;
|
||||
alertController.popoverPresentationController.sourceRect = [formViewController.tableView convertRect:v.frame fromView:self];
|
||||
__weak __typeof(self)weakSelf = self;
|
||||
for (id option in self.rowDescriptor.selectorOptions) {
|
||||
[actionSheet addButtonWithTitle:[option displayText]];
|
||||
}
|
||||
actionSheet.cancelButtonIndex = [actionSheet addButtonWithTitle:NSLocalizedString(@"Cancel", nil)];
|
||||
actionSheet.tag = [self.rowDescriptor hash];
|
||||
[actionSheet showInView:controller.view];
|
||||
#else
|
||||
if ([UIAlertController class]) {
|
||||
XLFormViewController * formViewController = self.formViewController;
|
||||
UIAlertController * alertController = [UIAlertController alertControllerWithTitle:self.rowDescriptor.selectorTitle
|
||||
message:nil
|
||||
preferredStyle:UIAlertControllerStyleActionSheet];
|
||||
[alertController addAction:[UIAlertAction actionWithTitle:NSLocalizedString(@"Cancel", nil)
|
||||
style:UIAlertActionStyleCancel
|
||||
handler:nil]];
|
||||
alertController.popoverPresentationController.sourceView = formViewController.tableView;
|
||||
UIView* v = (self.detailTextLabel ?: self.textLabel) ?: self.contentView;
|
||||
alertController.popoverPresentationController.sourceRect = [formViewController.tableView convertRect:v.frame fromView:self];
|
||||
__weak __typeof(self)weakSelf = self;
|
||||
for (id option in self.rowDescriptor.selectorOptions) {
|
||||
NSString *optionTitle = [option displayText];
|
||||
if (self.rowDescriptor.valueTransformer){
|
||||
NSAssert([self.rowDescriptor.valueTransformer isSubclassOfClass:[NSValueTransformer class]], @"valueTransformer is not a subclass of NSValueTransformer");
|
||||
NSValueTransformer * valueTransformer = [self.rowDescriptor.valueTransformer new];
|
||||
NSString * transformedValue = [valueTransformer transformedValue:[option valueData]];
|
||||
if (transformedValue) {
|
||||
optionTitle = transformedValue;
|
||||
}
|
||||
}
|
||||
[alertController addAction:[UIAlertAction actionWithTitle:optionTitle
|
||||
style:UIAlertActionStyleDefault
|
||||
handler:^(UIAlertAction *action) {
|
||||
[weakSelf.rowDescriptor setValue:option];
|
||||
[formViewController.tableView reloadData];
|
||||
}]];
|
||||
NSString *optionTitle = [option displayText];
|
||||
if (self.rowDescriptor.valueTransformer){
|
||||
NSAssert([self.rowDescriptor.valueTransformer isSubclassOfClass:[NSValueTransformer class]], @"valueTransformer is not a subclass of NSValueTransformer");
|
||||
NSValueTransformer * valueTransformer = [self.rowDescriptor.valueTransformer new];
|
||||
NSString * transformedValue = [valueTransformer transformedValue:[option valueData]];
|
||||
if (transformedValue) {
|
||||
optionTitle = transformedValue;
|
||||
}
|
||||
}
|
||||
[formViewController presentViewController:alertController animated:YES completion:nil];
|
||||
[alertController addAction:[UIAlertAction actionWithTitle:optionTitle
|
||||
style:UIAlertActionStyleDefault
|
||||
handler:^(UIAlertAction *action) {
|
||||
[weakSelf.rowDescriptor setValue:option];
|
||||
[formViewController.tableView reloadData];
|
||||
}]];
|
||||
}
|
||||
#ifndef XL_APP_EXTENSIONS
|
||||
else{
|
||||
UIActionSheet * actionSheet = [[UIActionSheet alloc] initWithTitle:self.rowDescriptor.selectorTitle
|
||||
delegate:self
|
||||
cancelButtonTitle:nil
|
||||
destructiveButtonTitle:nil
|
||||
otherButtonTitles:nil];
|
||||
for (id option in self.rowDescriptor.selectorOptions) {
|
||||
[actionSheet addButtonWithTitle:[option displayText]];
|
||||
}
|
||||
actionSheet.cancelButtonIndex = [actionSheet addButtonWithTitle:NSLocalizedString(@"Cancel", nil)];
|
||||
actionSheet.tag = [self.rowDescriptor hash];
|
||||
[actionSheet showInView:controller.view];
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
[formViewController presentViewController:alertController animated:YES completion:nil];
|
||||
[controller.tableView deselectRowAtIndexPath:[controller.form indexPathOfFormRow:self.rowDescriptor] animated:YES];
|
||||
}
|
||||
else if ([self.rowDescriptor.rowType isEqualToString:XLFormRowDescriptorTypeSelectorAlertView]){
|
||||
|
||||
#if __IPHONE_OS_VERSION_MAX_ALLOWED < 80000
|
||||
UIAlertView * alertView = [[UIAlertView alloc] initWithTitle:self.rowDescriptor.selectorTitle
|
||||
message:nil
|
||||
delegate:self
|
||||
cancelButtonTitle:nil
|
||||
otherButtonTitles:nil];
|
||||
UIAlertController * alertController = [UIAlertController alertControllerWithTitle:self.rowDescriptor.selectorTitle
|
||||
message:nil
|
||||
preferredStyle:UIAlertControllerStyleAlert];
|
||||
__weak __typeof(self)weakSelf = self;
|
||||
for (id option in self.rowDescriptor.selectorOptions) {
|
||||
[alertView addButtonWithTitle:[option displayText]];
|
||||
[alertController addAction:[UIAlertAction actionWithTitle:[option displayText]
|
||||
style:UIAlertActionStyleDefault
|
||||
handler:^(UIAlertAction *action) {
|
||||
[weakSelf.rowDescriptor setValue:option];
|
||||
[weakSelf.formViewController.tableView reloadData];
|
||||
}]];
|
||||
}
|
||||
alertView.cancelButtonIndex = [alertView addButtonWithTitle:NSLocalizedString(@"Cancel", nil)];
|
||||
alertView.tag = [self.rowDescriptor hash];
|
||||
[alertView show];
|
||||
#else
|
||||
if ([UIAlertController class]) {
|
||||
UIAlertController * alertController = [UIAlertController alertControllerWithTitle:self.rowDescriptor.selectorTitle
|
||||
message:nil
|
||||
preferredStyle:UIAlertControllerStyleAlert];
|
||||
__weak __typeof(self)weakSelf = self;
|
||||
for (id option in self.rowDescriptor.selectorOptions) {
|
||||
[alertController addAction:[UIAlertAction actionWithTitle:[option displayText]
|
||||
style:UIAlertActionStyleDefault
|
||||
handler:^(UIAlertAction *action) {
|
||||
[weakSelf.rowDescriptor setValue:option];
|
||||
[weakSelf.formViewController.tableView reloadData];
|
||||
}]];
|
||||
}
|
||||
[alertController addAction:[UIAlertAction actionWithTitle:NSLocalizedString(@"Cancel", nil)
|
||||
style:UIAlertActionStyleCancel
|
||||
handler:nil]];
|
||||
[controller presentViewController:alertController animated:YES completion:nil];
|
||||
|
||||
}
|
||||
#ifndef XL_APP_EXTENSIONS
|
||||
else{
|
||||
UIAlertView * alertView = [[UIAlertView alloc] initWithTitle:self.rowDescriptor.selectorTitle
|
||||
message:nil
|
||||
delegate:self
|
||||
cancelButtonTitle:nil
|
||||
otherButtonTitles:nil];
|
||||
for (id option in self.rowDescriptor.selectorOptions) {
|
||||
[alertView addButtonWithTitle:[option displayText]];
|
||||
}
|
||||
alertView.cancelButtonIndex = [alertView addButtonWithTitle:NSLocalizedString(@"Cancel", nil)];
|
||||
alertView.tag = [self.rowDescriptor hash];
|
||||
[alertView show];
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
[alertController addAction:[UIAlertAction actionWithTitle:NSLocalizedString(@"Cancel", nil)
|
||||
style:UIAlertActionStyleCancel
|
||||
handler:nil]];
|
||||
[controller presentViewController:alertController animated:YES completion:nil];
|
||||
[controller.tableView deselectRowAtIndexPath:[controller.form indexPathOfFormRow:self.rowDescriptor] animated:YES];
|
||||
}
|
||||
else if ([self.rowDescriptor.rowType isEqualToString:XLFormRowDescriptorTypeSelectorPickerView]){
|
||||
@@ -372,47 +327,6 @@
|
||||
self.detailTextLabel.textColor = _beforeChangeColor;
|
||||
}
|
||||
|
||||
#if __IPHONE_OS_VERSION_MIN_REQUIRED < 80000
|
||||
|
||||
#pragma mark - UIActionSheetDelegate
|
||||
|
||||
- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
|
||||
{
|
||||
if ([self.rowDescriptor.rowType isEqualToString:XLFormRowDescriptorTypeSelectorActionSheet]){
|
||||
if ([actionSheet cancelButtonIndex] != buttonIndex){
|
||||
NSString * title = [actionSheet buttonTitleAtIndex:buttonIndex];
|
||||
for (id option in self.rowDescriptor.selectorOptions){
|
||||
if ([[option displayText] isEqualToString:title]){
|
||||
[self.rowDescriptor setValue:option];
|
||||
[self.formViewController.tableView reloadData];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#pragma mark - UIAlertViewDelegate
|
||||
|
||||
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
|
||||
{
|
||||
if ([self.rowDescriptor.rowType isEqualToString:XLFormRowDescriptorTypeSelectorAlertView]){
|
||||
if ([alertView cancelButtonIndex] != buttonIndex){
|
||||
NSString * title = [alertView buttonTitleAtIndex:buttonIndex];
|
||||
for (id option in self.rowDescriptor.selectorOptions){
|
||||
if ([[option displayText] isEqualToString:title]){
|
||||
[self.rowDescriptor setValue:option];
|
||||
[self.formViewController.tableView reloadData];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#pragma mark - UIPickerViewDelegate
|
||||
|
||||
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
|
||||
@@ -449,6 +363,11 @@
|
||||
return self.rowDescriptor.selectorOptions.count;
|
||||
}
|
||||
|
||||
#pragma mark - UIPopoverPresentationControllerDelegate
|
||||
|
||||
- (void)popoverPresentationControllerDidDismissPopover:(UIPopoverPresentationController *)popoverPresentationController {
|
||||
[self.formViewController.tableView reloadData];
|
||||
}
|
||||
|
||||
#pragma mark - Helpers
|
||||
|
||||
@@ -493,12 +412,4 @@
|
||||
return nil;
|
||||
}
|
||||
|
||||
|
||||
#pragma mark - UIPopoverControllerDelegate
|
||||
|
||||
- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController
|
||||
{
|
||||
[self.formViewController.tableView reloadData];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@@ -31,10 +31,10 @@ extern NSString *const XLFormTextFieldMaxNumberOfCharacters;
|
||||
|
||||
@interface XLFormTextFieldCell : XLFormBaseCell <XLFormReturnKeyProtocol>
|
||||
|
||||
@property (nonatomic, readonly) UILabel * textLabel;
|
||||
@property (nonatomic, readonly) UITextField * textField;
|
||||
@property (nonatomic, readonly, weak) UILabel * textLabel;
|
||||
@property (nonatomic, readonly, weak) UITextField * textField;
|
||||
|
||||
@property (nonatomic) NSNumber *textFieldLengthPercentage;
|
||||
@property (nonatomic) NSNumber *textFieldMaxNumberOfCharacters;
|
||||
@property (nonatomic, copy) NSNumber *textFieldLengthPercentage;
|
||||
@property (nonatomic, copy) NSNumber *textFieldMaxNumberOfCharacters;
|
||||
|
||||
@end
|
||||
|
||||
Regular → Executable
+46
-25
@@ -34,7 +34,7 @@ NSString *const XLFormTextFieldMaxNumberOfCharacters = @"textFieldMaxNumberOfCha
|
||||
|
||||
@interface XLFormTextFieldCell() <UITextFieldDelegate>
|
||||
|
||||
@property NSMutableArray * dynamicCustomConstraints;
|
||||
@property (nonatomic, strong) NSMutableArray * dynamicCustomConstraints;
|
||||
|
||||
@end
|
||||
|
||||
@@ -69,8 +69,14 @@ NSString *const XLFormTextFieldMaxNumberOfCharacters = @"textFieldMaxNumberOfCha
|
||||
|
||||
-(void)dealloc
|
||||
{
|
||||
[self.textField removeTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged];
|
||||
[self.textLabel removeObserver:self forKeyPath:@"text"];
|
||||
[self.imageView removeObserver:self forKeyPath:@"image"];
|
||||
|
||||
self.textField.delegate = nil;
|
||||
|
||||
[self.dynamicCustomConstraints removeAllObjects];
|
||||
self.dynamicCustomConstraints = nil;
|
||||
}
|
||||
|
||||
#pragma mark - XLFormDescriptorCell
|
||||
@@ -79,8 +85,14 @@ NSString *const XLFormTextFieldMaxNumberOfCharacters = @"textFieldMaxNumberOfCha
|
||||
{
|
||||
[super configure];
|
||||
[self setSelectionStyle:UITableViewCellSelectionStyleNone];
|
||||
[self.contentView addSubview:self.textLabel];
|
||||
[self.contentView addSubview:self.textField];
|
||||
UILabel *textLabel = [UILabel autolayoutView];
|
||||
[self.contentView addSubview:textLabel];
|
||||
_textLabel = textLabel;
|
||||
|
||||
UITextField *textField = [UITextField autolayoutView];
|
||||
[self.contentView addSubview:textField];
|
||||
_textField = textField;
|
||||
|
||||
[self.contentView addConstraints:[self layoutConstraints]];
|
||||
[self.textLabel addObserver:self forKeyPath:@"text" options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew context:0];
|
||||
[self.imageView addObserver:self forKeyPath:@"image" options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew context:0];
|
||||
@@ -150,8 +162,33 @@ NSString *const XLFormTextFieldMaxNumberOfCharacters = @"textFieldMaxNumberOfCha
|
||||
|
||||
self.textField.text = self.rowDescriptor.value ? [self.rowDescriptor displayTextValue] : self.rowDescriptor.noValueDisplayText;
|
||||
[self.textField setEnabled:!self.rowDescriptor.isDisabled];
|
||||
self.textField.textColor = self.rowDescriptor.isDisabled ? [UIColor grayColor] : [UIColor blackColor];
|
||||
self.textField.font = [UIFont preferredFontForTextStyle:UIFontTextStyleBody];
|
||||
|
||||
UIColor * textColor = nil;
|
||||
UIColor * disabledTextColor = nil;
|
||||
|
||||
if (@available(iOS 13.0, *)) {
|
||||
textColor = [self traitCollection].userInterfaceStyle == UIUserInterfaceStyleDark ? [UIColor systemGrayColor] : [UIColor blackColor];
|
||||
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.textField.textColor = disabledTextColor;
|
||||
}
|
||||
else {
|
||||
self.textField.textColor = textColor;
|
||||
}
|
||||
}
|
||||
|
||||
-(BOOL)formDescriptorCellCanBecomeFirstResponder
|
||||
@@ -176,22 +213,6 @@ NSString *const XLFormTextFieldMaxNumberOfCharacters = @"textFieldMaxNumberOfCha
|
||||
[self.formViewController updateFormRow:self.rowDescriptor];
|
||||
}
|
||||
|
||||
#pragma mark - Properties
|
||||
|
||||
-(UILabel *)textLabel
|
||||
{
|
||||
if (_textLabel) return _textLabel;
|
||||
_textLabel = [UILabel autolayoutView];
|
||||
return _textLabel;
|
||||
}
|
||||
|
||||
-(UITextField *)textField
|
||||
{
|
||||
if (_textField) return _textField;
|
||||
_textField = [UITextField autolayoutView];
|
||||
return _textField;
|
||||
}
|
||||
|
||||
#pragma mark - LayoutConstraints
|
||||
|
||||
-(NSArray *)layoutConstraints
|
||||
@@ -225,10 +246,10 @@ NSString *const XLFormTextFieldMaxNumberOfCharacters = @"textFieldMaxNumberOfCha
|
||||
self.dynamicCustomConstraints = [NSMutableArray arrayWithArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:[image]-[label]-[textField]-|" options:0 metrics:nil views:views]];
|
||||
[self.dynamicCustomConstraints addObject:[NSLayoutConstraint constraintWithItem:_textField
|
||||
attribute:NSLayoutAttributeWidth
|
||||
relatedBy:self.textFieldLengthPercentage ? NSLayoutRelationEqual : NSLayoutRelationGreaterThanOrEqual
|
||||
relatedBy:self.textFieldLengthPercentage != nil ? NSLayoutRelationEqual : NSLayoutRelationGreaterThanOrEqual
|
||||
toItem:self.contentView
|
||||
attribute:NSLayoutAttributeWidth
|
||||
multiplier:self.textFieldLengthPercentage ? [self.textFieldLengthPercentage floatValue] : 0.3
|
||||
multiplier:self.textFieldLengthPercentage != nil ? [self.textFieldLengthPercentage floatValue] : 0.3
|
||||
constant:0.0]];
|
||||
}
|
||||
else{
|
||||
@@ -240,10 +261,10 @@ NSString *const XLFormTextFieldMaxNumberOfCharacters = @"textFieldMaxNumberOfCha
|
||||
self.dynamicCustomConstraints = [NSMutableArray arrayWithArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[label]-[textField]-|" options:0 metrics:nil views:views]];
|
||||
[self.dynamicCustomConstraints addObject:[NSLayoutConstraint constraintWithItem:_textField
|
||||
attribute:NSLayoutAttributeWidth
|
||||
relatedBy:self.textFieldLengthPercentage ? NSLayoutRelationEqual : NSLayoutRelationGreaterThanOrEqual
|
||||
relatedBy:self.textFieldLengthPercentage != nil ? NSLayoutRelationEqual : NSLayoutRelationGreaterThanOrEqual
|
||||
toItem:self.contentView
|
||||
attribute:NSLayoutAttributeWidth
|
||||
multiplier:self.textFieldLengthPercentage ? [self.textFieldLengthPercentage floatValue] : 0.3
|
||||
multiplier:self.textFieldLengthPercentage != nil ? [self.textFieldLengthPercentage floatValue] : 0.3
|
||||
constant:0.0]];
|
||||
}
|
||||
else{
|
||||
@@ -279,7 +300,7 @@ NSString *const XLFormTextFieldMaxNumberOfCharacters = @"textFieldMaxNumberOfCha
|
||||
}
|
||||
|
||||
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
|
||||
if (self.textFieldMaxNumberOfCharacters) {
|
||||
if (self.textFieldMaxNumberOfCharacters != nil) {
|
||||
// Check maximum length requirement
|
||||
NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string];
|
||||
if (newString.length > self.textFieldMaxNumberOfCharacters.integerValue) {
|
||||
|
||||
@@ -33,10 +33,10 @@ extern NSString *const XLFormTextViewMaxNumberOfCharacters;
|
||||
@interface XLFormTextViewCell : XLFormBaseCell
|
||||
|
||||
@property (nonatomic, readonly) UILabel * label DEPRECATED_ATTRIBUTE DEPRECATED_MSG_ATTRIBUTE("Use textLabel instead");
|
||||
@property (nonatomic, readonly) UILabel * textLabel;
|
||||
@property (nonatomic, readonly) XLFormTextView * textView;
|
||||
@property (nonatomic, readonly, weak) UILabel * textLabel;
|
||||
@property (nonatomic, readonly, weak) XLFormTextView * textView;
|
||||
|
||||
@property (nonatomic) NSNumber *textViewLengthPercentage;
|
||||
@property (nonatomic) NSNumber *textViewMaxNumberOfCharacters;
|
||||
@property (nonatomic, copy) NSNumber *textViewLengthPercentage;
|
||||
@property (nonatomic, copy) NSNumber *textViewMaxNumberOfCharacters;
|
||||
|
||||
@end
|
||||
|
||||
Regular → Executable
+38
-20
@@ -70,34 +70,26 @@ NSString *const XLFormTextViewMaxNumberOfCharacters = @"textViewMaxNumberOfChara
|
||||
|
||||
#pragma mark - Properties
|
||||
|
||||
-(UILabel *)textLabel
|
||||
{
|
||||
if (_textLabel) return _textLabel;
|
||||
_textLabel = [UILabel autolayoutView];
|
||||
[_textLabel setContentHuggingPriority:500 forAxis:UILayoutConstraintAxisHorizontal];
|
||||
return _textLabel;
|
||||
}
|
||||
|
||||
-(UILabel *)label
|
||||
{
|
||||
return self.textLabel;
|
||||
}
|
||||
|
||||
-(XLFormTextView *)textView
|
||||
{
|
||||
if (_textView) return _textView;
|
||||
_textView = [XLFormTextView autolayoutView];
|
||||
return _textView;
|
||||
}
|
||||
|
||||
#pragma mark - XLFormDescriptorCell
|
||||
|
||||
-(void)configure
|
||||
{
|
||||
[super configure];
|
||||
[self setSelectionStyle:UITableViewCellSelectionStyleNone];
|
||||
[self.contentView addSubview:self.textLabel];
|
||||
[self.contentView addSubview:self.textView];
|
||||
UILabel *textLabel = [UILabel autolayoutView];
|
||||
[textLabel setContentHuggingPriority:500 forAxis:UILayoutConstraintAxisHorizontal];
|
||||
[self.contentView addSubview:textLabel];
|
||||
_textLabel = textLabel;
|
||||
|
||||
XLFormTextView *textView = [XLFormTextView autolayoutView];
|
||||
[self.contentView addSubview:textView];
|
||||
_textView = textView;
|
||||
|
||||
[self.textLabel addObserver:self forKeyPath:@"text" options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew context:0];
|
||||
NSDictionary * views = @{@"label": self.textLabel, @"textView": self.textView};
|
||||
[self.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-8-[label]" options:0 metrics:0 views:views]];
|
||||
@@ -115,8 +107,34 @@ NSString *const XLFormTextViewMaxNumberOfCharacters = @"textViewMaxNumberOfChara
|
||||
self.textView.keyboardType = UIKeyboardTypeDefault;
|
||||
self.textView.text = self.rowDescriptor.value;
|
||||
[self.textView setEditable:!self.rowDescriptor.isDisabled];
|
||||
self.textView.textColor = self.rowDescriptor.isDisabled ? [UIColor grayColor] : [UIColor blackColor];
|
||||
self.textLabel.text = ((self.rowDescriptor.required && self.rowDescriptor.title && self.rowDescriptor.sectionDescriptor.formDescriptor.addAsteriskToRequiredRowsTitle) ? [NSString stringWithFormat:@"%@*", self.rowDescriptor.title]: self.rowDescriptor.title);
|
||||
self.textView.backgroundColor = self.textLabel.backgroundColor;
|
||||
|
||||
UIColor * textColor = nil;
|
||||
UIColor * disabledTextColor = nil;
|
||||
|
||||
if (@available(iOS 13.0, *)) {
|
||||
textColor = [self traitCollection].userInterfaceStyle == UIUserInterfaceStyleDark ? [UIColor systemGrayColor] : [UIColor blackColor];
|
||||
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.textView.textColor = disabledTextColor;
|
||||
}
|
||||
else {
|
||||
self.textView.textColor = textColor;
|
||||
}
|
||||
}
|
||||
|
||||
+(CGFloat)formDescriptorCellHeightForRowDescriptor:(XLFormRowDescriptor *)rowDescriptor
|
||||
@@ -160,7 +178,7 @@ NSString *const XLFormTextViewMaxNumberOfCharacters = @"textViewMaxNumberOfChara
|
||||
}
|
||||
else{
|
||||
[_dynamicCustomConstraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[label]-[textView]-|" options:0 metrics:0 views:views]];
|
||||
if (self.textViewLengthPercentage) {
|
||||
if (self.textViewLengthPercentage != nil) {
|
||||
[_dynamicCustomConstraints addObject:[NSLayoutConstraint constraintWithItem:_textView
|
||||
attribute:NSLayoutAttributeWidth
|
||||
relatedBy:NSLayoutRelationEqual
|
||||
@@ -207,7 +225,7 @@ NSString *const XLFormTextViewMaxNumberOfCharacters = @"textViewMaxNumberOfChara
|
||||
}
|
||||
|
||||
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
|
||||
if (self.textViewMaxNumberOfCharacters) {
|
||||
if (self.textViewMaxNumberOfCharacters != nil) {
|
||||
// Check maximum length requirement
|
||||
NSString *newText = [textView.text stringByReplacingCharactersInRange:range withString:text];
|
||||
if (newText.length > self.textViewMaxNumberOfCharacters.integerValue) {
|
||||
|
||||
@@ -28,6 +28,9 @@
|
||||
|
||||
@interface XLFormOptionsObject : NSObject <XLFormOptionObject,NSCoding>
|
||||
|
||||
@property (nonatomic, copy) NSString * formDisplaytext;
|
||||
@property (nonatomic, strong) id formValue;
|
||||
|
||||
+(XLFormOptionsObject *)formOptionsObjectWithValue:(id)value displayText:(NSString *)displayText;
|
||||
+(XLFormOptionsObject *)formOptionsOptionForValue:(id)value fromOptions:(NSArray *)options;
|
||||
+(XLFormOptionsObject *)formOptionsOptionForDisplayText:(NSString *)displayText fromOptions:(NSArray *)options;
|
||||
|
||||
@@ -26,10 +26,6 @@
|
||||
#import "XLFormOptionsObject.h"
|
||||
|
||||
@implementation XLFormOptionsObject
|
||||
{
|
||||
NSString * _formDisplaytext;
|
||||
id _formValue;
|
||||
}
|
||||
|
||||
+(XLFormOptionsObject *)formOptionsObjectWithValue:(id)value displayText:(NSString *)displayText
|
||||
{
|
||||
@@ -85,6 +81,7 @@
|
||||
{
|
||||
return _formValue;
|
||||
}
|
||||
|
||||
#pragma mark - NSCoding
|
||||
-(void)encodeWithCoder:(NSCoder *)encoder
|
||||
{
|
||||
@@ -94,6 +91,7 @@
|
||||
[encoder encodeObject:self.formDisplayText
|
||||
forKey:@"formDisplayText"];
|
||||
}
|
||||
|
||||
-(instancetype)initWithCoder:(NSCoder *)decoder
|
||||
{
|
||||
if ((self=[super init])) {
|
||||
@@ -108,4 +106,10 @@
|
||||
return self;
|
||||
|
||||
}
|
||||
|
||||
-(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];
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -60,6 +60,7 @@ typedef NS_ENUM(NSUInteger, XLFormRowNavigationDirection) {
|
||||
|
||||
-(NSArray *)formValidationErrors;
|
||||
-(void)showFormValidationError:(NSError *)error;
|
||||
-(void)showFormValidationError:(NSError *)error withTitle:(NSString*)title;
|
||||
|
||||
-(UITableViewRowAnimation)insertRowAnimationForRow:(XLFormRowDescriptor *)formRow;
|
||||
-(UITableViewRowAnimation)deleteRowAnimationForRow:(XLFormRowDescriptor *)formRow;
|
||||
@@ -78,10 +79,10 @@ typedef NS_ENUM(NSUInteger, XLFormRowNavigationDirection) {
|
||||
|
||||
@end
|
||||
|
||||
@interface XLFormViewController : UIViewController<UITableViewDataSource, UITableViewDelegate, XLFormDescriptorDelegate, UITextFieldDelegate, UITextViewDelegate, UIActionSheetDelegate, XLFormViewControllerDelegate>
|
||||
@interface XLFormViewController : UIViewController<UITableViewDataSource, UITableViewDelegate, XLFormDescriptorDelegate, UITextFieldDelegate, UITextViewDelegate, XLFormViewControllerDelegate>
|
||||
|
||||
@property XLFormDescriptor * form;
|
||||
@property IBOutlet UITableView * tableView;
|
||||
@property (nonatomic, strong) XLFormDescriptor * form;
|
||||
@property (nonatomic, weak) IBOutlet UITableView * tableView;
|
||||
|
||||
-(instancetype)initWithForm:(XLFormDescriptor *)form;
|
||||
-(instancetype)initWithForm:(XLFormDescriptor *)form style:(UITableViewStyle)style;
|
||||
|
||||
@@ -33,7 +33,6 @@
|
||||
|
||||
@interface XLFormRowDescriptor(_XLFormViewController)
|
||||
|
||||
@property (readonly) NSArray * observers;
|
||||
-(BOOL)evaluateIsDisabled;
|
||||
-(BOOL)evaluateIsHidden;
|
||||
|
||||
@@ -47,7 +46,7 @@
|
||||
|
||||
@interface XLFormDescriptor (_XLFormViewController)
|
||||
|
||||
@property NSMutableDictionary* rowObservers;
|
||||
@property (atomic, strong) NSMutableDictionary* rowObservers;
|
||||
|
||||
@end
|
||||
|
||||
@@ -57,8 +56,8 @@
|
||||
NSNumber *_oldBottomTableContentInset;
|
||||
CGRect _keyboardFrame;
|
||||
}
|
||||
@property UITableViewStyle tableViewStyle;
|
||||
@property (nonatomic) XLFormRowNavigationAccessoryView * navigationAccessoryView;
|
||||
@property (nonatomic, assign) UITableViewStyle tableViewStyle;
|
||||
@property (nonatomic, strong) XLFormRowNavigationAccessoryView * navigationAccessoryView;
|
||||
|
||||
@end
|
||||
|
||||
@@ -104,25 +103,34 @@
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)dealloc
|
||||
-(void)dealloc
|
||||
{
|
||||
[self removeObserverFromController];
|
||||
|
||||
self.tableView.delegate = nil;
|
||||
self.tableView.dataSource = nil;
|
||||
|
||||
self.form.delegate = nil;
|
||||
|
||||
self.navigationAccessoryView = nil;
|
||||
}
|
||||
|
||||
- (void)viewDidLoad
|
||||
-(void)viewDidLoad
|
||||
{
|
||||
[super viewDidLoad];
|
||||
if (!self.tableView){
|
||||
self.tableView = [[UITableView alloc] initWithFrame:self.view.bounds
|
||||
|
||||
UITableView *tableView = self.tableView;
|
||||
if (!tableView){
|
||||
tableView = [[UITableView alloc] initWithFrame:self.view.bounds
|
||||
style:self.tableViewStyle];
|
||||
self.tableView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
|
||||
if([self.tableView respondsToSelector:@selector(cellLayoutMarginsFollowReadableWidth)]){
|
||||
self.tableView.cellLayoutMarginsFollowReadableWidth = NO;
|
||||
tableView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
|
||||
if([tableView respondsToSelector:@selector(cellLayoutMarginsFollowReadableWidth)]){
|
||||
tableView.cellLayoutMarginsFollowReadableWidth = NO;
|
||||
}
|
||||
}
|
||||
if (!self.tableView.superview){
|
||||
[self.view addSubview:self.tableView];
|
||||
if (!tableView.superview){
|
||||
[self.view addSubview:tableView];
|
||||
self.tableView = tableView;
|
||||
}
|
||||
if (!self.tableView.delegate){
|
||||
self.tableView.delegate = self;
|
||||
@@ -147,44 +155,18 @@
|
||||
{
|
||||
[super viewWillAppear:animated];
|
||||
NSIndexPath *selected = [self.tableView indexPathForSelectedRow];
|
||||
if (selected){
|
||||
if (selected) {
|
||||
// Trigger a cell refresh
|
||||
XLFormRowDescriptor * rowDescriptor = [self.form formRowAtIndex:selected];
|
||||
[self updateFormRow:rowDescriptor];
|
||||
[self.tableView selectRowAtIndexPath:selected animated:NO scrollPosition:UITableViewScrollPositionNone];
|
||||
[self.tableView deselectRowAtIndexPath:selected animated:YES];
|
||||
}
|
||||
[[NSNotificationCenter defaultCenter] addObserver:self
|
||||
selector:@selector(contentSizeCategoryChanged:)
|
||||
name:UIContentSizeCategoryDidChangeNotification
|
||||
object:nil];
|
||||
[[NSNotificationCenter defaultCenter] addObserver:self
|
||||
selector:@selector(keyboardWillShow:)
|
||||
name:UIKeyboardWillShowNotification
|
||||
object:nil];
|
||||
|
||||
[[NSNotificationCenter defaultCenter] addObserver:self
|
||||
selector:@selector(keyboardWillHide:)
|
||||
name:UIKeyboardWillHideNotification
|
||||
object:nil];
|
||||
|
||||
|
||||
[self addObserverToController];
|
||||
}
|
||||
|
||||
-(void)viewDidDisappear:(BOOL)animated
|
||||
{
|
||||
[super viewDidDisappear:animated];
|
||||
[[NSNotificationCenter defaultCenter] removeObserver:self
|
||||
name:UIContentSizeCategoryDidChangeNotification
|
||||
object:nil];
|
||||
[[NSNotificationCenter defaultCenter] removeObserver:self
|
||||
name:UIKeyboardWillShowNotification
|
||||
object:nil];
|
||||
[[NSNotificationCenter defaultCenter] removeObserver:self
|
||||
name:UIKeyboardWillHideNotification
|
||||
object:nil];
|
||||
}
|
||||
|
||||
- (void)viewDidAppear:(BOOL)animated
|
||||
-(void)viewDidAppear:(BOOL)animated
|
||||
{
|
||||
[super viewDidAppear:animated];
|
||||
if (self.form.assignFirstResponderOnShow) {
|
||||
@@ -193,11 +175,40 @@
|
||||
}
|
||||
}
|
||||
|
||||
-(void)viewDidDisappear:(BOOL)animated
|
||||
{
|
||||
[super viewDidDisappear:animated];
|
||||
|
||||
[self removeObserverFromController];
|
||||
}
|
||||
|
||||
- (void)didReceiveMemoryWarning
|
||||
{
|
||||
[super didReceiveMemoryWarning];
|
||||
}
|
||||
|
||||
-(void)addObserverToController {
|
||||
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
|
||||
[nc addObserver:self
|
||||
selector:@selector(contentSizeCategoryChanged:)
|
||||
name:UIContentSizeCategoryDidChangeNotification
|
||||
object:nil];
|
||||
[nc addObserver:self
|
||||
selector:@selector(keyboardWillShow:)
|
||||
name:UIKeyboardWillShowNotification
|
||||
object:nil];
|
||||
[nc addObserver:self
|
||||
selector:@selector(keyboardWillHide:)
|
||||
name:UIKeyboardWillHideNotification
|
||||
object:nil];
|
||||
}
|
||||
|
||||
-(void)removeObserverFromController {
|
||||
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
|
||||
[nc removeObserver:self name:UIContentSizeCategoryDidChangeNotification object:nil];
|
||||
[nc removeObserver:self name:UIKeyboardWillShowNotification object:nil];
|
||||
[nc removeObserver:self name:UIKeyboardWillHideNotification object:nil];
|
||||
}
|
||||
#pragma mark - CellClasses
|
||||
|
||||
+(NSMutableDictionary *)cellClassesForRowDescriptorTypes
|
||||
@@ -314,8 +325,8 @@
|
||||
|
||||
-(void)updateAfterDependentRowChanged:(XLFormRowDescriptor *)formRow
|
||||
{
|
||||
NSMutableArray* revaluateHidden = self.form.rowObservers[[formRow.tag formKeyForPredicateType:XLPredicateTypeHidden]];
|
||||
NSMutableArray* revaluateDisabled = self.form.rowObservers[[formRow.tag formKeyForPredicateType:XLPredicateTypeDisabled]];
|
||||
NSMutableArray* revaluateHidden = [self.form.rowObservers[[formRow.tag formKeyForPredicateType:XLPredicateTypeHidden]] mutableCopy];
|
||||
NSMutableArray* revaluateDisabled = [self.form.rowObservers[[formRow.tag formKeyForPredicateType:XLPredicateTypeDisabled]] mutableCopy];
|
||||
for (id object in revaluateDisabled) {
|
||||
if ([object isKindOfClass:[NSString class]]) {
|
||||
XLFormRowDescriptor* row = [self.form formRowWithTag:object];
|
||||
@@ -434,9 +445,10 @@
|
||||
XLFormSectionDescriptor * multivaluedFormSection = formRow.sectionDescriptor;
|
||||
XLFormRowDescriptor * formRowDescriptor = [self formRowFormMultivaluedFormSection:multivaluedFormSection];
|
||||
[multivaluedFormSection addFormRow:formRowDescriptor];
|
||||
__weak typeof(self) weak = self;
|
||||
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.02 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
|
||||
self.tableView.editing = !self.tableView.editing;
|
||||
self.tableView.editing = !self.tableView.editing;
|
||||
weak.tableView.editing = !weak.tableView.editing;
|
||||
weak.tableView.editing = !weak.tableView.editing;
|
||||
});
|
||||
UITableViewCell<XLFormDescriptorCell> * cell = (UITableViewCell<XLFormDescriptorCell> *)[formRowDescriptor cellForFormController:self];
|
||||
if ([cell formDescriptorCellCanBecomeFirstResponder]){
|
||||
@@ -462,34 +474,24 @@
|
||||
|
||||
-(void)showFormValidationError:(NSError *)error
|
||||
{
|
||||
#if __IPHONE_OS_VERSION_MAX_ALLOWED < 80000
|
||||
UIAlertView * alertView = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"XLFormViewController_ValidationErrorTitle", nil)
|
||||
message:error.localizedDescription
|
||||
delegate:self
|
||||
cancelButtonTitle:NSLocalizedString(@"OK", nil)
|
||||
otherButtonTitles:nil];
|
||||
[alertView show];
|
||||
#else
|
||||
if ([UIAlertController class]){
|
||||
UIAlertController * alertController = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"XLFormViewController_ValidationErrorTitle", nil)
|
||||
message:error.localizedDescription
|
||||
preferredStyle:UIAlertControllerStyleAlert];
|
||||
[alertController addAction:[UIAlertAction actionWithTitle:@"OK"
|
||||
style:UIAlertActionStyleDefault
|
||||
handler:nil]];
|
||||
[self presentViewController:alertController animated:YES completion:nil];
|
||||
}
|
||||
#ifndef XL_APP_EXTENSIONS
|
||||
else{
|
||||
UIAlertView * alertView = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"XLFormViewController_ValidationErrorTitle", nil)
|
||||
message:error.localizedDescription
|
||||
delegate:self
|
||||
cancelButtonTitle:NSLocalizedString(@"OK", nil)
|
||||
otherButtonTitles:nil];
|
||||
[alertView show];
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
UIAlertController * alertController = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"XLFormViewController_ValidationErrorTitle", nil)
|
||||
message:error.localizedDescription
|
||||
preferredStyle:UIAlertControllerStyleAlert];
|
||||
[alertController addAction:[UIAlertAction actionWithTitle:@"OK"
|
||||
style:UIAlertActionStyleDefault
|
||||
handler:nil]];
|
||||
[self presentViewController:alertController animated:YES completion:nil];
|
||||
}
|
||||
|
||||
-(void)showFormValidationError:(NSError *)error withTitle:(NSString*)title
|
||||
{
|
||||
UIAlertController * alertController = [UIAlertController alertControllerWithTitle:NSLocalizedString(title, nil)
|
||||
message:error.localizedDescription
|
||||
preferredStyle:UIAlertControllerStyleAlert];
|
||||
[alertController addAction:[UIAlertAction actionWithTitle:@"OK"
|
||||
style:UIAlertActionStyleDefault
|
||||
handler:nil]];
|
||||
[self presentViewController:alertController animated:YES completion:nil];
|
||||
}
|
||||
|
||||
-(void)performFormSelector:(SEL)selector withObject:(id)sender
|
||||
@@ -578,18 +580,24 @@
|
||||
-(XLFormBaseCell *)updateFormRow:(XLFormRowDescriptor *)formRow
|
||||
{
|
||||
XLFormBaseCell * cell = [formRow cellForFormController:self];
|
||||
[self configureCell:cell];
|
||||
[cell setNeedsUpdateConstraints];
|
||||
[cell setNeedsLayout];
|
||||
if (cell != nil) {
|
||||
[self configureCell:cell];
|
||||
[cell setNeedsUpdateConstraints];
|
||||
[cell setNeedsLayout];
|
||||
}
|
||||
return cell;
|
||||
}
|
||||
|
||||
-(void)configureCell:(XLFormBaseCell*) cell
|
||||
{
|
||||
[cell update];
|
||||
[cell.rowDescriptor.cellConfig enumerateKeysAndObjectsUsingBlock:^(NSString *keyPath, id value, BOOL * __unused stop) {
|
||||
[cell setValue:(value == [NSNull null]) ? nil : value forKeyPath:keyPath];
|
||||
}];
|
||||
|
||||
if(cell.rowDescriptor != nil && cell.rowDescriptor.cellConfig != nil) {
|
||||
[cell.rowDescriptor.cellConfig enumerateKeysAndObjectsUsingBlock:^(NSString *keyPath, id value, BOOL * __unused stop) {
|
||||
[cell setValue:(value == [NSNull null]) ? nil : value forKeyPath:keyPath];
|
||||
}];
|
||||
}
|
||||
|
||||
if (cell.rowDescriptor.isDisabled){
|
||||
[cell.rowDescriptor.cellConfigIfDisabled enumerateKeysAndObjectsUsingBlock:^(NSString *keyPath, id value, BOOL * __unused stop) {
|
||||
[cell setValue:(value == [NSNull null]) ? nil : value forKeyPath:keyPath];
|
||||
@@ -660,9 +668,10 @@
|
||||
#pragma GCC diagnostic pop
|
||||
// update the accessory view
|
||||
[self inputAccessoryViewForRowDescriptor:row];
|
||||
__weak typeof(self) weak = self;
|
||||
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.05 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
|
||||
self.tableView.editing = !self.tableView.editing;
|
||||
self.tableView.editing = !self.tableView.editing;
|
||||
weak.tableView.editing = !weak.tableView.editing;
|
||||
weak.tableView.editing = !weak.tableView.editing;
|
||||
});
|
||||
|
||||
}
|
||||
@@ -677,9 +686,10 @@
|
||||
[self.tableView endEditing:YES];
|
||||
}
|
||||
[multivaluedFormRow.sectionDescriptor removeFormRowAtIndex:indexPath.row];
|
||||
__weak typeof(self) weak = self;
|
||||
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.02 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
|
||||
self.tableView.editing = !self.tableView.editing;
|
||||
self.tableView.editing = !self.tableView.editing;
|
||||
weak.tableView.editing = !weak.tableView.editing;
|
||||
weak.tableView.editing = !weak.tableView.editing;
|
||||
});
|
||||
if (firstResponder){
|
||||
UITableViewCell<XLFormDescriptorCell> * firstResponderCell = [firstResponder formDescriptorCell];
|
||||
@@ -696,9 +706,10 @@
|
||||
else{
|
||||
XLFormRowDescriptor * formRowDescriptor = [self formRowFormMultivaluedFormSection:multivaluedFormSection];
|
||||
[multivaluedFormSection addFormRow:formRowDescriptor];
|
||||
__weak typeof(self) weak = self;
|
||||
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.02 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
|
||||
self.tableView.editing = !self.tableView.editing;
|
||||
self.tableView.editing = !self.tableView.editing;
|
||||
weak.tableView.editing = !weak.tableView.editing;
|
||||
weak.tableView.editing = !weak.tableView.editing;
|
||||
});
|
||||
[self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:indexPath.row + 1 inSection:indexPath.section] atScrollPosition:UITableViewScrollPositionBottom animated:YES];
|
||||
UITableViewCell<XLFormDescriptorCell> * cell = (UITableViewCell<XLFormDescriptorCell> *)[formRowDescriptor cellForFormController:self];
|
||||
|
||||
@@ -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];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
@@ -69,5 +69,6 @@ typedef NS_ENUM(NSUInteger, XLFormSectionInsertMode) {
|
||||
-(void)addFormRow:(nonnull XLFormRowDescriptor *)formRow beforeRow:(nonnull XLFormRowDescriptor *)beforeRow;
|
||||
-(void)removeFormRowAtIndex:(NSUInteger)index;
|
||||
-(void)removeFormRow:(nonnull XLFormRowDescriptor *)formRow;
|
||||
-(void)moveRowAtIndexPath:(nonnull NSIndexPath *)sourceIndex toIndexPath:(nonnull NSIndexPath *)destinationIndex;
|
||||
|
||||
@end
|
||||
|
||||
@@ -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.
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -29,9 +29,9 @@
|
||||
@interface XLFormTextView : UITextView
|
||||
|
||||
|
||||
@property (nonatomic) NSString *placeholder;
|
||||
@property (nonatomic) UIColor *placeholderColor;
|
||||
@property (nonatomic, copy) NSString *placeholder;
|
||||
@property (nonatomic, copy) UIColor *placeholderColor;
|
||||
|
||||
@property (readonly) UILabel *placeHolderLabel;
|
||||
@property (nonatomic, readonly, weak) UILabel *placeHolderLabel;
|
||||
|
||||
@end
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
|
||||
- (void)dealloc
|
||||
{
|
||||
[[NSNotificationCenter defaultCenter] removeObserver:self];
|
||||
[[NSNotificationCenter defaultCenter] removeObserver:self name:UITextViewTextDidChangeNotification object:nil];
|
||||
}
|
||||
|
||||
- (instancetype)initWithFrame:(CGRect)frame
|
||||
@@ -67,17 +67,19 @@
|
||||
{
|
||||
if([[self placeholder] length] > 0){
|
||||
if (_placeHolderLabel == nil ){
|
||||
_placeHolderLabel = [[UILabel alloc] initWithFrame:CGRectMake(4,8,self.bounds.size.width - 16,0)];
|
||||
_placeHolderLabel.lineBreakMode = NSLineBreakByWordWrapping;
|
||||
_placeHolderLabel.numberOfLines = 0;
|
||||
_placeHolderLabel.backgroundColor = [UIColor clearColor];
|
||||
_placeHolderLabel.textColor = self.placeholderColor;
|
||||
_placeHolderLabel.alpha = 0;
|
||||
_placeHolderLabel.tag = 999;
|
||||
[self addSubview:_placeHolderLabel];
|
||||
UILabel *placeHolderLabel = [[UILabel alloc] initWithFrame:CGRectMake(4,8,self.bounds.size.width - 16,0)];
|
||||
placeHolderLabel.lineBreakMode = NSLineBreakByWordWrapping;
|
||||
placeHolderLabel.numberOfLines = 0;
|
||||
placeHolderLabel.backgroundColor = [UIColor clearColor];
|
||||
placeHolderLabel.textColor = self.placeholderColor;
|
||||
placeHolderLabel.alpha = 0;
|
||||
placeHolderLabel.tag = 999;
|
||||
[self addSubview:placeHolderLabel];
|
||||
_placeHolderLabel = placeHolderLabel;
|
||||
}
|
||||
_placeHolderLabel.text = self.placeholder;
|
||||
_placeHolderLabel.font = self.font;
|
||||
_placeHolderLabel.textColor = self.placeholderColor;
|
||||
[_placeHolderLabel sizeToFit];
|
||||
[self sendSubviewToBack:_placeHolderLabel];
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -29,8 +29,8 @@
|
||||
|
||||
@interface XLFormValidationStatus : NSObject
|
||||
|
||||
@property NSString *msg;
|
||||
@property BOOL isValid;
|
||||
@property (nonatomic, copy) NSString *msg;
|
||||
@property (nonatomic, assign) BOOL isValid;
|
||||
@property (nonatomic, weak) XLFormRowDescriptor *rowDescriptor;
|
||||
|
||||
//-(instancetype)initWithMsg:(NSString*)msg andStatus:(BOOL)isValid;
|
||||
|
||||
Reference in New Issue
Block a user