Compare commits
96 Commits
3.1.1
...
updateReadme
| Author | SHA1 | Date | |
|---|---|---|---|
| 825c6c3467 | |||
| 1da30107dc | |||
| 4674c3abaf | |||
| 5ca54fd949 | |||
| e64e5b4885 | |||
| b28c902d73 | |||
| dc5f1e6dcd | |||
| 55e440bc57 | |||
| be2fb864be | |||
| cdd498ebc7 | |||
| cd43abc3f0 | |||
| f1a83512d1 | |||
| 00ccf60895 | |||
| 27a172eb65 | |||
| e62404d24b | |||
| d1aff91e63 | |||
| a0a8cf793c | |||
| bb81e88572 | |||
| 64ab7ccac0 | |||
| 9baeda1b0d | |||
| 6879f01230 | |||
| 50e9efe783 | |||
| bf819ba0ed | |||
| 087bbf089c | |||
| eac2f816d7 | |||
| b19bf9bafc | |||
| ce869235bc | |||
| bb93c90c2d | |||
| 7b50e19cf6 | |||
| 8eefa8afd9 | |||
| ca53315145 | |||
| c3263f7645 | |||
| fbf800fc21 | |||
| fbc08a7094 | |||
| f1f8a21bf0 | |||
| 694c08beee | |||
| c7d5708f16 | |||
| dd294cc709 | |||
| cda0327def | |||
| 9a2bdf1ca0 | |||
| d8b67b5c21 | |||
| f30fa9bb31 | |||
| 9b1e7d6d4e | |||
| fac9cefc2b | |||
| d202a40824 | |||
| d185e642e0 | |||
| 743c5d289a | |||
| de86c5e60e | |||
| f52c532fec | |||
| 274892dc95 | |||
| 09b28286de | |||
| bbca57a2e6 | |||
| d29275b780 | |||
| 11f54cee17 | |||
| 418b3e4c96 | |||
| 6da2fc456c | |||
| 52be3f3531 | |||
| 5e00deb474 | |||
| 2a8ebf2af5 | |||
| 5c716a665d | |||
| 60e67b9651 | |||
| 6aac513398 | |||
| 0491752090 | |||
| c32e28f753 | |||
| 2b55aeac74 | |||
| 94959f9da8 | |||
| 25798bb123 | |||
| d6d14140cf | |||
| c036d7a06b | |||
| 51760a535a | |||
| 542191ba69 | |||
| c1b64f7828 | |||
| 8009dd8cb7 | |||
| 8d65cbe361 | |||
| 79eb596143 | |||
| 0e866a0f22 | |||
| d68166c669 | |||
| 72115e32ea | |||
| 5475ed7ed7 | |||
| 8bdeb264c1 | |||
| 437c1e4d38 | |||
| 972815d7ea | |||
| eeb165b1cc | |||
| 47dfa518c4 | |||
| bb9aceff75 | |||
| 0d24f47f75 | |||
| 7ae1a5d612 | |||
| 0db6e546c5 | |||
| 1229cb8d6a | |||
| 756fdb914b | |||
| 3df413b0fa | |||
| 97b79f1f93 | |||
| ba949c3697 | |||
| e31c6db521 | |||
| 15a4ce9d83 | |||
| 5b136eb458 |
+1
-1
@@ -1,5 +1,5 @@
|
||||
language: objective-c
|
||||
osx_image: xcode7.2
|
||||
osx_image: xcode8.2
|
||||
before_install:
|
||||
- gem install cocoapods --no-rdoc --no-ri --no-document --quiet
|
||||
- gem install xcpretty --no-rdoc --no-ri --no-document --quiet
|
||||
|
||||
+137
@@ -0,0 +1,137 @@
|
||||
# Change Log
|
||||
All notable changes to this project will be documented in this file.
|
||||
|
||||
### Version 3.3.0:
|
||||
* Added `cellConfigForSelector` to style XLFormOptionsViewController
|
||||
* Added properties to **limit number of characters** in `XLFormTextFieldCell` and `XLFormTextViewCell`
|
||||
* Minor fixes
|
||||
|
||||
### Version 3.2.0:
|
||||
* Added XL_APP_EXTENSIONS macro to allow app extensions (@MuscleRumble #357)
|
||||
* Added shouldChangeTextInRange delegate call for UITextView. (@kiancheong #782)
|
||||
* Added support for NSFormatter (@ziogaschr, @fwhenin, @bhirt-bpl #306)
|
||||
* Added `height` property to XLFormRowDescriptor to allow setting height of individual cells.
|
||||
|
||||
### Version 3.1.2:
|
||||
* Update row in `cellForRowAtIndexPath` instead of `willDisplayCell`
|
||||
* Added cancel action to image selector (by koenpunt)
|
||||
* Other minor fixes
|
||||
|
||||
### Version 3.1.1
|
||||
* Allow setting width percentage on UITextView
|
||||
* Added custom inline row example
|
||||
* Fixed bug where XLFormImageCell was not added to project
|
||||
* Add ability to `end editing` on scroll
|
||||
* Other bugs and refactor
|
||||
|
||||
### Version 3.1.0
|
||||
* Added Carthage support
|
||||
* Added NSCoding protocol
|
||||
* Allowed HTTP connections
|
||||
* Several bugfixes and improvements.
|
||||
|
||||
### Version 3.0.2
|
||||
* Fix issue when inline pickers expand beyond table.
|
||||
|
||||
### Version 3.0.1
|
||||
|
||||
* Improvements and bug fixes.
|
||||
* Ability to left, right align textfields. Ability to set up a minimum textField width.
|
||||
* If form is being shown, assigning a new form automatically reload the tableview.
|
||||
* Update objective-c and swift example projects.
|
||||
* Swift compatibility fixes.
|
||||
* Long email validation added.
|
||||
* Fixed row copy issue, now valueTransformer value is copied.
|
||||
* Fixed step counter row layout issues.
|
||||
* Fixed issue "Last form field hides beneath enabled navigation controller's toolbar".
|
||||
* Fixed issue "Navigating between cells using bottom navigation buttons causes table cell dividers to disappear".
|
||||
* Use UIAlertController instead UIActionSheet/UIAlertView if possible.
|
||||
* Hidden and disabled rows resign first responder before changing state.
|
||||
* onChangeBlock added to rowDescriptor.
|
||||
* use tintColor as default button row color.
|
||||
* By default accessoryView is no longer shown for inline rows.
|
||||
* Fix NSBundle issues to use XLForm as dynamic framework.
|
||||
|
||||
### Version 3.0.0
|
||||
|
||||
* `hidden`, `disable` properties added to `XLFormRowDescriptor`. `@YES` `@NO` or a `NSPredicate` can be used to hide, disable de row.
|
||||
* `hidden` property added to `XLFormSectionDescriptor`. `@YES` `@NO` or a `NSPredicate` can be used to hide the section.
|
||||
* Added `XLFormRowDescriptorTypeCountDownTimerInline` and `XLFormRowDescriptorTypeCountDownTimer` row type with an example.
|
||||
* Deleted `dateFormatter` property and added support to use the `NSValueTransformer` to convert the selected object to a NSString in the XLFormDateCell class.
|
||||
|
||||
* Added `XLFormRowDescriptorTypeCountDownTimerInline` and `XLFormRowDescriptorTypeCountDownTimer` row type with an example.
|
||||
* Deleted `dateFormatter` property and added support to use the `NSValueTransformer` to convert the selected object to a NSString in the XLFormDateCell class.
|
||||
|
||||
|
||||
### Version 2.2.0
|
||||
|
||||
* Fixed "(null)" caption when `XLFormRowDescriptorTypeSelectorLeftRight` row required error message is shown.
|
||||
* Refresh the cell content instead of recreating one, when the form get back from a selection.
|
||||
* Added XLFormRowDescriptor to validations error to easily show an error mask.
|
||||
* Use row tag in validation error message if row does not have a title. It is also possible to set up a custom message if needed
|
||||
* Added a convenience method to add a XLFormRowDescriptor instance before another one.
|
||||
* Allow nil values in cellConfig and cellConfigAtConfigure.
|
||||
* Fix constraints for textFieldCell when it is configured to be right aligned.
|
||||
* Add asterisk to required segmentedCells if needed.
|
||||
* Fail validation for empty strings and NSNull on required rows.
|
||||
* Segue support added to buttons and selectors.
|
||||
* Ability to configure a storyboardId or a viewController nibName to by used by button and selector rows as presented view controller.
|
||||
* Fix scrolling to top when status bar is tapped.
|
||||
* Fix wrong type of XLFormRowDescriptorTypeDecimal row. Now it's converted to NSNumber.
|
||||
* Fix issue: XLFormRegexValidator only checks regex validation for NSStrings, not working for number.
|
||||
* Callconfigure method from awakeFromNib on XLFormBaseCell.
|
||||
* Assign form.delegate from inside setForm: method.
|
||||
* Added custom cell, validation, reordering, can insert, can delete examples.
|
||||
* Added support for inputAccessoryView. Default input accessory view allows to navigate among rows. Fully optionally and customizable.
|
||||
* Added suport for row navigation. Fully optionally and customizable.
|
||||
* beginEditing: endEditing: methods added. These method are called each time a row gains / loses firstResponder. They bring the ability to do UI changes.
|
||||
* Read Only mode added. `disable` property added to XLFormDescriptor class.
|
||||
* Rename `label` XLFormTextViewCell property as `textLabel`.
|
||||
* fix position of multivalued section accessory view.
|
||||
* Can delete, can delete, can reorder section mode added. it's possible to enable some of them, don't need to enable all modes.
|
||||
|
||||
### Version 2.1.0
|
||||
|
||||
* Change `XLFormRowDescriptorTypeText`, `XLFormRowDescriptorTypeName` and `XLFormRowDescriptorTypeTextView` keyboard type to `UIKeyboardTypeDefault`.
|
||||
* Added `XLFormRowDescriptorTypeInfo` row type and example.
|
||||
* Added `XLFormRowDescriptorTypeSelectorPopover` row type and example.
|
||||
* CI added. Created Test project into Tests folder and set up Travis.
|
||||
* Documented how to customize UI. Added an example.
|
||||
* Now XLFormViewController extends from UIViewController instead of UITableViewController.
|
||||
* Added tableView property as a XLFormViewController IBOutlet.
|
||||
* Added support for storyboard reuse identifier and nib file.
|
||||
* Button selection can be handled using a selector or block.
|
||||
* Added addAsteriskToRequiredRowsTitle property to XLFormDescriptor. NO is used as value by default.
|
||||
* Image cell has been removed because it depends on AFNetworking and now needs to be implemented as a custom cell. You can find the image custom cell in Examples/Others/CustomCells.
|
||||
|
||||
### Version 2.0.0
|
||||
|
||||
* Added `XLFormRowDescriptorTypeMultipleSelector` row type and example.
|
||||
* Added `XLFormRowDescriptorTypeSelectorPickerView` row type and example.
|
||||
* Added `XLFormRowDescriptorTypeSelectorPickerViewInline` row type and example.
|
||||
* Added generic way to create inline selector rows.
|
||||
* Ability to customize row animations.
|
||||
* `(NSDictionary *)formValues;` XLFormViewController method added in order to get raw form data.
|
||||
* Added `XLFormRowDescriptorTypeSelectorSegmentedControl` row type and example.
|
||||
* AFNetworking dependency removed.
|
||||
* Added `XLFormRowDescriptorTypeStepCounter` row type and related example.
|
||||
|
||||
|
||||
### Version 1.0.1
|
||||
|
||||
* Added storyboard example.
|
||||
* Added button `XLFormRowDescriptorTypeButton` example.
|
||||
* Documented how to add a custom row.
|
||||
* Fixed issues: [#2](https://github.com/xmartlabs/XLForm/issues/2 "#2"), [#3](https://github.com/xmartlabs/XLForm/issues/3 "#3"), [#27](https://github.com/xmartlabs/XLForm/issues/27 "#27"), [#38](https://github.com/xmartlabs/XLForm/issues/38 "#38").
|
||||
* Fixed crash caused by inline date rows. [#6](https://github.com/xmartlabs/XLForm/issues/6 "#6")
|
||||
* Fixed ipad issue *invalid cell layout*. [#10](https://github.com/xmartlabs/XLForm/issues/10 "#10")
|
||||
* New convenience methods to insert sections dinamically. [#13](https://github.com/xmartlabs/XLForm/pull/13 "#13")
|
||||
* Change default label style to `UIFontTextStyleBody`. [#18](https://github.com/xmartlabs/XLForm/issues/18 "#18")
|
||||
* Added step counter row, `XLFormRowDescriptorTypeStepCounter`.
|
||||
* Added `initWithCoder` initializer to `XLFormViewController`. [#32](https://github.com/xmartlabs/XLForm/issues/32 "#32").
|
||||
* Added a convenience method to deselect a `XLFormRowDescriptor`. `-(void)deselectFormRow:(XLFormRowDescriptor *)row;`. [#33](https://github.com/xmartlabs/XLForm/issues/33 "#33").
|
||||
|
||||
|
||||
### Version 1.0.0
|
||||
|
||||
* Initial release
|
||||
@@ -34,6 +34,7 @@
|
||||
#import "CustomRowsViewController.h"
|
||||
#import "AccessoryViewFormViewController.h"
|
||||
#import "PredicateFormViewController.h"
|
||||
#import "FormattersViewController.h"
|
||||
|
||||
NSString * const kTextFieldAndTextView = @"TextFieldAndTextView";
|
||||
NSString * const kSelectors = @"Selectors";
|
||||
@@ -46,6 +47,7 @@ NSString * const kMultivaluedOnlyReorder = @"MultivaluedOnlyReorder";
|
||||
NSString * const kMultivaluedOnlyInsert = @"MultivaluedOnlyInsert";
|
||||
NSString * const kMultivaluedOnlyDelete = @"MultivaluedOnlyDelete";
|
||||
NSString * const kValidations= @"Validations";
|
||||
NSString * const kFormatters = @"Formatters";
|
||||
|
||||
@interface ExamplesFormViewController ()
|
||||
|
||||
@@ -113,6 +115,11 @@ NSString * const kValidations= @"Validations";
|
||||
row.action.viewControllerClass = [DatesFormViewController class];
|
||||
[section addFormRow:row];
|
||||
|
||||
// NSFormatters
|
||||
row = [XLFormRowDescriptor formRowDescriptorWithTag:kFormatters rowType:XLFormRowDescriptorTypeButton title:@"NSFormatter Support"];
|
||||
row.action.viewControllerClass = [FormattersViewController class];
|
||||
[section addFormRow:row];
|
||||
|
||||
// Others
|
||||
row = [XLFormRowDescriptor formRowDescriptorWithTag:kOthes rowType:XLFormRowDescriptorTypeButton title:@"Other Rows"];
|
||||
row.action.formSegueIdentifier = @"OthersFormViewControllerSegue";
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
//
|
||||
// FormattersViewController.h
|
||||
// XLForm
|
||||
//
|
||||
// Created by Freddy Henin on 12/29/14.
|
||||
// Copyright (c) 2014 Xmartlabs. All rights reserved.
|
||||
//
|
||||
|
||||
#import "XLFormViewController.h"
|
||||
|
||||
@interface FormattersViewController : XLFormViewController
|
||||
|
||||
@end
|
||||
@@ -0,0 +1,120 @@
|
||||
//
|
||||
// FormattersViewController.m
|
||||
// XLForm
|
||||
//
|
||||
// Created by Freddy Henin on 12/29/14.
|
||||
// Copyright (c) 2014 Xmartlabs. All rights reserved.
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
|
||||
#import "XLForm.h"
|
||||
|
||||
#import "FormattersViewController.h"
|
||||
|
||||
#import <SHSPhoneComponent/SHSPhoneNumberFormatter+UserConfig.h>
|
||||
|
||||
|
||||
// Simple little class to demonstraite currency formatting. Unfortunally we have to subclass
|
||||
// NSNumberFormatter to work aroundn some long known rounding bugs with NSNumberFormatter
|
||||
// http://stackoverflow.com/questions/12580162/nsstring-to-nsdate-conversion-issue
|
||||
@interface CurrencyFormatter : NSNumberFormatter
|
||||
|
||||
@property (readonly) NSDecimalNumberHandler *roundingBehavior;
|
||||
|
||||
@end
|
||||
|
||||
@implementation CurrencyFormatter
|
||||
|
||||
- (id) init
|
||||
{
|
||||
self = [super init];
|
||||
if (self) {
|
||||
[self setNumberStyle: NSNumberFormatterCurrencyStyle];
|
||||
[self setGeneratesDecimalNumbers:YES];
|
||||
|
||||
NSUInteger currencyScale = [self maximumFractionDigits];
|
||||
|
||||
_roundingBehavior = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundPlain scale:currencyScale raiseOnExactness:FALSE raiseOnOverflow:TRUE raiseOnUnderflow:TRUE raiseOnDivideByZero:TRUE];
|
||||
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
//- (BOOL)getObjectValue:(id *)anObject forString:(NSString *)string errorDescription:(NSString **)error
|
||||
//{
|
||||
// NSDecimalNumber *number;
|
||||
// BOOL success = [super getObjectValue:&number forString:string errorDescription:error];
|
||||
//
|
||||
// if (success) {
|
||||
// *anObject = [number decimalNumberByRoundingAccordingToBehavior:_roundingBehavior];
|
||||
// }
|
||||
// else {
|
||||
// *anObject = nil;
|
||||
// }
|
||||
//
|
||||
// return success;
|
||||
//}
|
||||
|
||||
@end
|
||||
|
||||
@interface FormattersViewController ()
|
||||
@end
|
||||
|
||||
@implementation FormattersViewController
|
||||
|
||||
-(id)init
|
||||
{
|
||||
XLFormDescriptor * formDescriptor = [XLFormDescriptor formDescriptorWithTitle:@"Text Fields"];
|
||||
XLFormSectionDescriptor * section;
|
||||
XLFormRowDescriptor * row;
|
||||
|
||||
formDescriptor.assignFirstResponderOnShow = NO;
|
||||
|
||||
section = [XLFormSectionDescriptor formSection];
|
||||
section.title = @"NSFormatter Support";
|
||||
section.footerTitle = @"Rows can be configured to use the formatter as you type or to toggle on and off during for display/editing. You will most likely need custom NSFormatter objects to do on the fly formatting since NSNumberFormatter is pretty limited in this regard.";
|
||||
[formDescriptor addFormSection:section];
|
||||
|
||||
// Phone
|
||||
SHSPhoneNumberFormatter *formatter = [[SHSPhoneNumberFormatter alloc] init];
|
||||
[formatter setDefaultOutputPattern:@"(###) ###-####" imagePath:nil];
|
||||
row = [XLFormRowDescriptor formRowDescriptorWithTag:@"phone" rowType:XLFormRowDescriptorTypePhone title:@"US Phone"];
|
||||
row.valueFormatter = formatter;
|
||||
[row.cellConfigAtConfigure setObject:@(NSTextAlignmentRight) forKey:@"textField.textAlignment"];
|
||||
|
||||
row.useValueFormatterDuringInput = YES;
|
||||
[section addFormRow:row];
|
||||
|
||||
// Currency
|
||||
row = [XLFormRowDescriptor formRowDescriptorWithTag:@"currency" rowType:XLFormRowDescriptorTypeDecimal title:@"USD"];
|
||||
CurrencyFormatter *numberFormatter = [[CurrencyFormatter alloc] init];
|
||||
row.valueFormatter = numberFormatter;
|
||||
row.value = [NSDecimalNumber numberWithDouble:9.95];
|
||||
[row.cellConfigAtConfigure setObject:@(NSTextAlignmentRight) forKey:@"textField.textAlignment"];
|
||||
[section addFormRow:row];
|
||||
|
||||
// Accounting
|
||||
row = [XLFormRowDescriptor formRowDescriptorWithTag:@"percent" rowType:XLFormRowDescriptorTypeNumber title:@"Test Score"];
|
||||
NSNumberFormatter *acctFormatter = [[NSNumberFormatter alloc] init];
|
||||
[acctFormatter setNumberStyle:NSNumberFormatterPercentStyle];
|
||||
row.valueFormatter = acctFormatter;
|
||||
row.value = @(0.75);
|
||||
[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];
|
||||
|
||||
return [super initWithForm:formDescriptor];
|
||||
|
||||
}
|
||||
|
||||
@end
|
||||
@@ -212,11 +212,13 @@ NSString *const kSelectorWithStoryboardId = @"selectorWithStoryboardId";
|
||||
mutableRightOptions = [rightOptions mutableCopy];
|
||||
[mutableRightOptions removeObjectAtIndex:1];
|
||||
leftRightSelectorOption = [XLFormLeftRightSelectorOption formLeftRightSelectorOptionWithLeftValue:[XLFormOptionsObject formOptionsObjectWithValue:@(1) displayText:@"Option 2"] httpParameterKey:@"option_2" rightOptions:mutableRightOptions];
|
||||
leftRightSelectorOption.leftValueChangePolicy = XLFormLeftRightSelectorOptionLeftValueChangePolicyChooseFirstOption;
|
||||
[leftRightSelectorOptions addObject:leftRightSelectorOption];
|
||||
|
||||
mutableRightOptions = [rightOptions mutableCopy];
|
||||
[mutableRightOptions removeObjectAtIndex:2];
|
||||
leftRightSelectorOption = [XLFormLeftRightSelectorOption formLeftRightSelectorOptionWithLeftValue:[XLFormOptionsObject formOptionsObjectWithValue:@(2) displayText:@"Option 3"] httpParameterKey:@"option_3" rightOptions:mutableRightOptions];
|
||||
leftRightSelectorOption.leftValueChangePolicy = XLFormLeftRightSelectorOptionLeftValueChangePolicyChooseLastOption;
|
||||
[leftRightSelectorOptions addObject:leftRightSelectorOption];
|
||||
|
||||
mutableRightOptions = [rightOptions mutableCopy];
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
source 'https://github.com/CocoaPods/Specs.git'
|
||||
platform :ios, '8.0'
|
||||
|
||||
target 'XLForm' do
|
||||
|
||||
pod 'XLForm', :path => '../../'
|
||||
|
||||
#Following pods are used for custom row examples
|
||||
@@ -8,3 +10,5 @@ pod 'AFNetworking', '~> 2.0', :inhibit_warnings => true
|
||||
pod 'XLData', :git => 'https://github.com/xmartlabs/XLData.git', :commit => '1f9019b56242a2019c7f7e11ec4ef823c397ebcf', :inhibit_warnings => true
|
||||
pod 'JVFloatLabeledTextField', '1.0.2', :inhibit_warnings => true
|
||||
pod 'AXRatingView', '1.0.3', :inhibit_warnings => true
|
||||
pod 'SHSPhoneComponent'
|
||||
end
|
||||
@@ -0,0 +1,78 @@
|
||||
PODS:
|
||||
- AFNetworking (2.6.3):
|
||||
- AFNetworking/NSURLConnection (= 2.6.3)
|
||||
- AFNetworking/NSURLSession (= 2.6.3)
|
||||
- AFNetworking/Reachability (= 2.6.3)
|
||||
- AFNetworking/Security (= 2.6.3)
|
||||
- AFNetworking/Serialization (= 2.6.3)
|
||||
- AFNetworking/UIKit (= 2.6.3)
|
||||
- AFNetworking/NSURLConnection (2.6.3):
|
||||
- AFNetworking/Reachability
|
||||
- AFNetworking/Security
|
||||
- AFNetworking/Serialization
|
||||
- AFNetworking/NSURLSession (2.6.3):
|
||||
- AFNetworking/Reachability
|
||||
- AFNetworking/Security
|
||||
- AFNetworking/Serialization
|
||||
- AFNetworking/Reachability (2.6.3)
|
||||
- AFNetworking/Security (2.6.3)
|
||||
- AFNetworking/Serialization (2.6.3)
|
||||
- AFNetworking/UIKit (2.6.3):
|
||||
- AFNetworking/NSURLConnection
|
||||
- AFNetworking/NSURLSession
|
||||
- AXRatingView (1.0.3)
|
||||
- JVFloatLabeledTextField (1.0.2)
|
||||
- SHSPhoneComponent (2.15)
|
||||
- XLData (2.0.0):
|
||||
- XLData/Core (= 2.0.0)
|
||||
- XLData/CoreData (= 2.0.0)
|
||||
- XLData/CoreRemote (= 2.0.0)
|
||||
- XLData/DataStore (= 2.0.0)
|
||||
- XLData/RemoteCoreData (= 2.0.0)
|
||||
- XLData/RemoteDataStore (= 2.0.0)
|
||||
- XLData/Core (2.0.0)
|
||||
- XLData/CoreData (2.0.0):
|
||||
- XLData/Core
|
||||
- XLData/CoreRemote (2.0.0):
|
||||
- AFNetworking (~> 2.0)
|
||||
- XLData/DataStore (2.0.0):
|
||||
- XLData/Core
|
||||
- XLData/RemoteCoreData (2.0.0):
|
||||
- XLData/CoreData
|
||||
- XLData/CoreRemote
|
||||
- XLData/RemoteDataStore (2.0.0):
|
||||
- XLData/CoreRemote
|
||||
- XLData/DataStore
|
||||
- XLForm (3.1.2)
|
||||
|
||||
DEPENDENCIES:
|
||||
- AFNetworking (~> 2.0)
|
||||
- AXRatingView (= 1.0.3)
|
||||
- JVFloatLabeledTextField (= 1.0.2)
|
||||
- SHSPhoneComponent
|
||||
- XLData (from `https://github.com/xmartlabs/XLData.git`, commit `1f9019b56242a2019c7f7e11ec4ef823c397ebcf`)
|
||||
- XLForm (from `../../`)
|
||||
|
||||
EXTERNAL SOURCES:
|
||||
XLData:
|
||||
:commit: 1f9019b56242a2019c7f7e11ec4ef823c397ebcf
|
||||
:git: https://github.com/xmartlabs/XLData.git
|
||||
XLForm:
|
||||
:path: ../../
|
||||
|
||||
CHECKOUT OPTIONS:
|
||||
XLData:
|
||||
:commit: 1f9019b56242a2019c7f7e11ec4ef823c397ebcf
|
||||
:git: https://github.com/xmartlabs/XLData.git
|
||||
|
||||
SPEC CHECKSUMS:
|
||||
AFNetworking: cb8d14a848e831097108418f5d49217339d4eb60
|
||||
AXRatingView: ccaadc1bbda99a4b7e1d556059482d2b933a9f4e
|
||||
JVFloatLabeledTextField: 58a3a32cfb800e5b224f676987e7c13abf50a14d
|
||||
SHSPhoneComponent: 4cec0653a150ad63cbc52b0c8b29ce2d3c9c26f0
|
||||
XLData: df725c6179e2e0c80bf56a1ecad9afd169707a6d
|
||||
XLForm: 6bb3c20857e2983cf494cb8b4d666c2a24673d5e
|
||||
|
||||
PODFILE CHECKSUM: 80615792e859be64c95add3bb57c1596234faf95
|
||||
|
||||
COCOAPODS: 1.0.0
|
||||
@@ -33,7 +33,6 @@
|
||||
28A85D5918E346C100E81A26 /* XLFormImageSelectorCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 28A85D5818E346C100E81A26 /* XLFormImageSelectorCell.m */; };
|
||||
28DBB04118D76FDC00FB8A8B /* MultivaluedFormViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 28DBB04018D76FDC00FB8A8B /* MultivaluedFormViewController.m */; };
|
||||
28F89F2E1AA4EA5600E90218 /* ValidationExamplesFormViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 28F89F2D1AA4EA5600E90218 /* ValidationExamplesFormViewController.m */; };
|
||||
2CA9A3FC06E94345A2FDE415 /* libPods.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F6DF43B7BBF44F72A4493E8E /* libPods.a */; };
|
||||
3C0357F01AB0D82300200C8A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 3C0357EF1AB0D82300200C8A /* Images.xcassets */; };
|
||||
3C3B01D51AB741EF0027CD45 /* XLFormRatingCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C3B01D31AB741EF0027CD45 /* XLFormRatingCell.m */; };
|
||||
3C3B01DA1AB7497D0027CD45 /* XLFormWeekDaysCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C3B01D81AB7497D0027CD45 /* XLFormWeekDaysCell.m */; };
|
||||
@@ -41,6 +40,7 @@
|
||||
3C3B01E21AB7499A0027CD45 /* XLRatingView.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C3B01E01AB7499A0027CD45 /* XLRatingView.m */; };
|
||||
3C3B01F01AB74BDC0027CD45 /* FloatLabeledTextFieldCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C3B01EF1AB74BDC0027CD45 /* FloatLabeledTextFieldCell.m */; };
|
||||
3CDAFC7A1AB0AFA4000F75B6 /* CustomRowsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3CDAFC791AB0AFA4000F75B6 /* CustomRowsViewController.m */; };
|
||||
5BB6B032D80344C9E7D956CD /* libPods-XLForm.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 19383D268EF8024CB33FCCA4 /* libPods-XLForm.a */; };
|
||||
66B6266E1AE0055100007886 /* DateAndTimeValueTrasformer.m in Sources */ = {isa = PBXBuildFile; fileRef = 66B6266D1AE0055100007886 /* DateAndTimeValueTrasformer.m */; };
|
||||
BF01E9281C21F0BB00BDE045 /* XLFormInlineSegmentedCell.m in Sources */ = {isa = PBXBuildFile; fileRef = BF01E9271C21F0BB00BDE045 /* XLFormInlineSegmentedCell.m */; };
|
||||
BF9DB1D51AE0436600B985E7 /* BlogExampleViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BF9DB1D21AE0436600B985E7 /* BlogExampleViewController.m */; };
|
||||
@@ -49,9 +49,11 @@
|
||||
BFE91AFB1AE159B200DE5231 /* BasicPredicateViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BFE91AFA1AE159B200DE5231 /* BasicPredicateViewController.m */; };
|
||||
D51B8B2C19126664008C0478 /* XLFormCustomCell.m in Sources */ = {isa = PBXBuildFile; fileRef = D51B8B2B19126664008C0478 /* XLFormCustomCell.m */; };
|
||||
DEA6EF911B57D6CC000F4893 /* HTTPSessionManager.m in Sources */ = {isa = PBXBuildFile; fileRef = DEA6EF901B57D6CC000F4893 /* HTTPSessionManager.m */; };
|
||||
DEB8235C1AD5529A00AF9FE2 /* FormattersViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = DEB8235B1AD5529A00AF9FE2 /* FormattersViewController.m */; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
19383D268EF8024CB33FCCA4 /* libPods-XLForm.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-XLForm.a"; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
281E5BE719538F4A006D93C5 /* CLLocationValueTrasformer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CLLocationValueTrasformer.h; path = Examples/Selectors/CustomSelectors/XLFormRowViewController/CLLocationValueTrasformer.h; sourceTree = "<group>"; };
|
||||
281E5BE819538F4A006D93C5 /* CLLocationValueTrasformer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CLLocationValueTrasformer.m; path = Examples/Selectors/CustomSelectors/XLFormRowViewController/CLLocationValueTrasformer.m; sourceTree = "<group>"; };
|
||||
282EB27A1AB5FF33004A736F /* AccessoryViewFormViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AccessoryViewFormViewController.h; path = Examples/AccessoryViews/AccessoryViewFormViewController.h; sourceTree = "<group>"; };
|
||||
@@ -111,10 +113,10 @@
|
||||
3C3B01EF1AB74BDC0027CD45 /* FloatLabeledTextFieldCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = FloatLabeledTextFieldCell.m; path = Examples/CustomRows/FloatLabeledTextField/FloatLabeledTextFieldCell.m; sourceTree = "<group>"; };
|
||||
3CDAFC781AB0AFA4000F75B6 /* CustomRowsViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CustomRowsViewController.h; path = Examples/CustomRows/CustomRowsViewController.h; sourceTree = "<group>"; };
|
||||
3CDAFC791AB0AFA4000F75B6 /* CustomRowsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CustomRowsViewController.m; path = Examples/CustomRows/CustomRowsViewController.m; sourceTree = "<group>"; };
|
||||
5F6FC67A75254B60005DC716 /* Pods-XLForm.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-XLForm.debug.xcconfig"; path = "Pods/Target Support Files/Pods-XLForm/Pods-XLForm.debug.xcconfig"; sourceTree = "<group>"; };
|
||||
66B6266C1AE0055100007886 /* DateAndTimeValueTrasformer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DateAndTimeValueTrasformer.h; path = Examples/Dates/DateAndTimeValueTrasformer.h; sourceTree = "<group>"; };
|
||||
66B6266D1AE0055100007886 /* DateAndTimeValueTrasformer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = DateAndTimeValueTrasformer.m; path = Examples/Dates/DateAndTimeValueTrasformer.m; sourceTree = "<group>"; };
|
||||
7B0D2D6A86E2A41ED22E8A35 /* 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>"; };
|
||||
976A33EE62A018A7257B4878 /* 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>"; };
|
||||
B98C1213E7C714A861219C81 /* Pods-XLForm.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-XLForm.release.xcconfig"; path = "Pods/Target Support Files/Pods-XLForm/Pods-XLForm.release.xcconfig"; sourceTree = "<group>"; };
|
||||
BF01E9261C21F0BB00BDE045 /* XLFormInlineSegmentedCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = XLFormInlineSegmentedCell.h; path = "Inline Segmented/XLFormInlineSegmentedCell.h"; sourceTree = "<group>"; };
|
||||
BF01E9271C21F0BB00BDE045 /* XLFormInlineSegmentedCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = XLFormInlineSegmentedCell.m; path = "Inline Segmented/XLFormInlineSegmentedCell.m"; sourceTree = "<group>"; };
|
||||
BF9DB1D11AE0436600B985E7 /* BlogExampleViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = BlogExampleViewController.h; path = Examples/PredicateExamples/BlogExampleViewController.h; sourceTree = SOURCE_ROOT; };
|
||||
@@ -127,7 +129,8 @@
|
||||
D51B8B2B19126664008C0478 /* XLFormCustomCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = XLFormCustomCell.m; path = Examples/Others/CustomCells/XLFormCustomCell.m; sourceTree = "<group>"; };
|
||||
DEA6EF8F1B57D6CC000F4893 /* HTTPSessionManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = HTTPSessionManager.h; path = Examples/Selectors/HTTPSessionManager.h; sourceTree = "<group>"; };
|
||||
DEA6EF901B57D6CC000F4893 /* HTTPSessionManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = HTTPSessionManager.m; path = Examples/Selectors/HTTPSessionManager.m; sourceTree = "<group>"; };
|
||||
F6DF43B7BBF44F72A4493E8E /* libPods.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libPods.a; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
DEB8235A1AD5529A00AF9FE2 /* FormattersViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FormattersViewController.h; sourceTree = "<group>"; };
|
||||
DEB8235B1AD5529A00AF9FE2 /* FormattersViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FormattersViewController.m; sourceTree = "<group>"; };
|
||||
/* End PBXFileReference section */
|
||||
|
||||
/* Begin PBXFrameworksBuildPhase section */
|
||||
@@ -139,22 +142,13 @@
|
||||
2850C5FE18D0F706002B7D0A /* CoreGraphics.framework in Frameworks */,
|
||||
2850C60018D0F706002B7D0A /* UIKit.framework in Frameworks */,
|
||||
2850C5FC18D0F706002B7D0A /* Foundation.framework in Frameworks */,
|
||||
2CA9A3FC06E94345A2FDE415 /* libPods.a in Frameworks */,
|
||||
5BB6B032D80344C9E7D956CD /* libPods-XLForm.a in Frameworks */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXFrameworksBuildPhase section */
|
||||
|
||||
/* Begin PBXGroup section */
|
||||
15E61D225B0D27FAB51BDD90 /* Pods */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
7B0D2D6A86E2A41ED22E8A35 /* Pods.debug.xcconfig */,
|
||||
976A33EE62A018A7257B4878 /* Pods.release.xcconfig */,
|
||||
);
|
||||
name = Pods;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
282C5EEF18D33C1800A5D47C /* Inputs */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
@@ -261,7 +255,7 @@
|
||||
2850C60118D0F706002B7D0A /* XLForm */,
|
||||
2850C5FA18D0F706002B7D0A /* Frameworks */,
|
||||
2850C5F918D0F706002B7D0A /* Products */,
|
||||
15E61D225B0D27FAB51BDD90 /* Pods */,
|
||||
B6478577DDCB0DDDD433C572 /* Pods */,
|
||||
);
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
@@ -280,7 +274,7 @@
|
||||
2850C5FB18D0F706002B7D0A /* Foundation.framework */,
|
||||
2850C5FD18D0F706002B7D0A /* CoreGraphics.framework */,
|
||||
2850C5FF18D0F706002B7D0A /* UIKit.framework */,
|
||||
F6DF43B7BBF44F72A4493E8E /* libPods.a */,
|
||||
19383D268EF8024CB33FCCA4 /* libPods-XLForm.a */,
|
||||
);
|
||||
name = Frameworks;
|
||||
sourceTree = "<group>";
|
||||
@@ -312,6 +306,7 @@
|
||||
282EB2791AB5FD66004A736F /* AccessoryViews */,
|
||||
3CDAFC741AB0AEE5000F75B6 /* CustomRows */,
|
||||
28F89F2B1AA4E99500E90218 /* Validations */,
|
||||
DEB823591AD5529A00AF9FE2 /* Formatters */,
|
||||
283C6B7A1999BA1B00A5283D /* UICustomization */,
|
||||
28A76624193251E500D69546 /* AppDelegate.m */,
|
||||
28A8083C190D903D009D77F8 /* StoryboardExample */,
|
||||
@@ -429,6 +424,15 @@
|
||||
name = CustomRows;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
B6478577DDCB0DDDD433C572 /* Pods */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
5F6FC67A75254B60005DC716 /* Pods-XLForm.debug.xcconfig */,
|
||||
B98C1213E7C714A861219C81 /* Pods-XLForm.release.xcconfig */,
|
||||
);
|
||||
name = Pods;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
BF01E9251C21F02D00BDE045 /* Inline Segmented */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
@@ -461,6 +465,16 @@
|
||||
name = SessionManager;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
DEB823591AD5529A00AF9FE2 /* Formatters */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
DEB8235A1AD5529A00AF9FE2 /* FormattersViewController.h */,
|
||||
DEB8235B1AD5529A00AF9FE2 /* FormattersViewController.m */,
|
||||
);
|
||||
name = Formatters;
|
||||
path = Examples/Formatters;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
/* End PBXGroup section */
|
||||
|
||||
/* Begin PBXNativeTarget section */
|
||||
@@ -468,12 +482,12 @@
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = 2850C62418D0F707002B7D0A /* Build configuration list for PBXNativeTarget "XLForm" */;
|
||||
buildPhases = (
|
||||
0EA9FCE3DA0D444498836D37 /* Check Pods Manifest.lock */,
|
||||
EBE0335CCC7588D83B89A92A /* 📦 Check Pods Manifest.lock */,
|
||||
2850C5F418D0F706002B7D0A /* Sources */,
|
||||
2850C5F518D0F706002B7D0A /* Frameworks */,
|
||||
2850C5F618D0F706002B7D0A /* Resources */,
|
||||
CFE72E068B5F4D9BB45FB757 /* Copy Pods Resources */,
|
||||
734CC62A7A974D37CC982576 /* Embed Pods Frameworks */,
|
||||
32EB30E0A90A4E91864B1D3C /* 📦 Embed Pods Frameworks */,
|
||||
DE3D12F5596780A66C6C3D4A /* 📦 Copy Pods Resources */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
@@ -528,14 +542,44 @@
|
||||
/* End PBXResourcesBuildPhase section */
|
||||
|
||||
/* Begin PBXShellScriptBuildPhase section */
|
||||
0EA9FCE3DA0D444498836D37 /* Check Pods Manifest.lock */ = {
|
||||
32EB30E0A90A4E91864B1D3C /* 📦 Embed Pods Frameworks */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
inputPaths = (
|
||||
);
|
||||
name = "Check Pods Manifest.lock";
|
||||
name = "📦 Embed Pods Frameworks";
|
||||
outputPaths = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
shellPath = /bin/sh;
|
||||
shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-XLForm/Pods-XLForm-frameworks.sh\"\n";
|
||||
showEnvVarsInLog = 0;
|
||||
};
|
||||
DE3D12F5596780A66C6C3D4A /* 📦 Copy Pods Resources */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
inputPaths = (
|
||||
);
|
||||
name = "📦 Copy Pods Resources";
|
||||
outputPaths = (
|
||||
);
|
||||
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;
|
||||
@@ -543,36 +587,6 @@
|
||||
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";
|
||||
showEnvVarsInLog = 0;
|
||||
};
|
||||
734CC62A7A974D37CC982576 /* 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/Pods-frameworks.sh\"\n";
|
||||
showEnvVarsInLog = 0;
|
||||
};
|
||||
CFE72E068B5F4D9BB45FB757 /* Copy Pods Resources */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
inputPaths = (
|
||||
);
|
||||
name = "Copy Pods Resources";
|
||||
outputPaths = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
shellPath = /bin/sh;
|
||||
shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods/Pods-resources.sh\"\n";
|
||||
showEnvVarsInLog = 0;
|
||||
};
|
||||
/* End PBXShellScriptBuildPhase section */
|
||||
|
||||
/* Begin PBXSourcesBuildPhase section */
|
||||
@@ -606,6 +620,7 @@
|
||||
BF01E9281C21F0BB00BDE045 /* XLFormInlineSegmentedCell.m in Sources */,
|
||||
BF9DB1D61AE0436600B985E7 /* PredicateFormViewController.m in Sources */,
|
||||
BFE91AFB1AE159B200DE5231 /* BasicPredicateViewController.m in Sources */,
|
||||
DEB8235C1AD5529A00AF9FE2 /* FormattersViewController.m in Sources */,
|
||||
2843EB5218D4CFC700F13E2B /* OthersFormViewController.m in Sources */,
|
||||
2843EB4B18D496F600F13E2B /* SelectorsFormViewController.m in Sources */,
|
||||
28468EA418EF41D300DBB015 /* InputsFormViewController.m in Sources */,
|
||||
@@ -708,7 +723,7 @@
|
||||
};
|
||||
2850C62518D0F707002B7D0A /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 7B0D2D6A86E2A41ED22E8A35 /* Pods.debug.xcconfig */;
|
||||
baseConfigurationReference = 5F6FC67A75254B60005DC716 /* Pods-XLForm.debug.xcconfig */;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
|
||||
@@ -725,10 +740,11 @@
|
||||
};
|
||||
2850C62618D0F707002B7D0A /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 976A33EE62A018A7257B4878 /* Pods.release.xcconfig */;
|
||||
baseConfigurationReference = B98C1213E7C714A861219C81 /* Pods-XLForm.release.xcconfig */;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
|
||||
GCC_PRECOMPILE_PREFIX_HEADER = YES;
|
||||
GCC_PREFIX_HEADER = "XLForm/XLForm-Prefix.pch";
|
||||
INFOPLIST_FILE = "XLForm/XLForm-Info.plist";
|
||||
|
||||
@@ -356,11 +356,12 @@
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = 2847A6BD1AAF2679000A2ABE /* Build configuration list for PBXNativeTarget "SwiftExample" */;
|
||||
buildPhases = (
|
||||
21FCE00817B1AE1029F382A4 /* Check Pods Manifest.lock */,
|
||||
21FCE00817B1AE1029F382A4 /* 📦 Check Pods Manifest.lock */,
|
||||
2847A69A1AAF2679000A2ABE /* Sources */,
|
||||
2847A69B1AAF2679000A2ABE /* Frameworks */,
|
||||
2847A69C1AAF2679000A2ABE /* Resources */,
|
||||
A0F2DA95250A4C3E69515D96 /* Copy Pods Resources */,
|
||||
A0F2DA95250A4C3E69515D96 /* 📦 Copy Pods Resources */,
|
||||
DCA1F7B1D7E04613B3E151C1 /* 📦 Embed Pods Frameworks */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
@@ -379,11 +380,12 @@
|
||||
attributes = {
|
||||
LastSwiftMigration = 0700;
|
||||
LastSwiftUpdateCheck = 0700;
|
||||
LastUpgradeCheck = 0700;
|
||||
LastUpgradeCheck = 0800;
|
||||
ORGANIZATIONNAME = Xmartlabs;
|
||||
TargetAttributes = {
|
||||
2847A69D1AAF2679000A2ABE = {
|
||||
CreatedOnToolsVersion = 6.2;
|
||||
LastSwiftMigration = 0800;
|
||||
};
|
||||
};
|
||||
};
|
||||
@@ -421,14 +423,14 @@
|
||||
/* End PBXResourcesBuildPhase section */
|
||||
|
||||
/* Begin PBXShellScriptBuildPhase section */
|
||||
21FCE00817B1AE1029F382A4 /* Check Pods Manifest.lock */ = {
|
||||
21FCE00817B1AE1029F382A4 /* 📦 Check Pods Manifest.lock */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
inputPaths = (
|
||||
);
|
||||
name = "Check Pods Manifest.lock";
|
||||
name = "📦 Check Pods Manifest.lock";
|
||||
outputPaths = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
@@ -436,14 +438,14 @@
|
||||
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";
|
||||
showEnvVarsInLog = 0;
|
||||
};
|
||||
A0F2DA95250A4C3E69515D96 /* Copy Pods Resources */ = {
|
||||
A0F2DA95250A4C3E69515D96 /* 📦 Copy Pods Resources */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
inputPaths = (
|
||||
);
|
||||
name = "Copy Pods Resources";
|
||||
name = "📦 Copy Pods Resources";
|
||||
outputPaths = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
@@ -451,6 +453,21 @@
|
||||
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";
|
||||
showEnvVarsInLog = 0;
|
||||
};
|
||||
/* End PBXShellScriptBuildPhase section */
|
||||
|
||||
/* Begin PBXSourcesBuildPhase section */
|
||||
@@ -504,8 +521,10 @@
|
||||
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_OBJC_ROOT_CLASS = YES_ERROR;
|
||||
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
||||
@@ -514,6 +533,7 @@
|
||||
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",
|
||||
@@ -548,8 +568,10 @@
|
||||
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_OBJC_ROOT_CLASS = YES_ERROR;
|
||||
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
||||
@@ -557,6 +579,7 @@
|
||||
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;
|
||||
@@ -566,6 +589,7 @@
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 8.4;
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
SDKROOT = iphoneos;
|
||||
SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
VALIDATE_PRODUCT = YES;
|
||||
};
|
||||
@@ -582,6 +606,7 @@
|
||||
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;
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
@@ -596,6 +621,7 @@
|
||||
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;
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
class AccessoryViewFormViewController : XLFormViewController {
|
||||
|
||||
|
||||
private struct Tags {
|
||||
fileprivate struct Tags {
|
||||
static let AccessoryViewRowNavigationEnabled = "RowNavigationEnabled"
|
||||
static let AccessoryViewRowNavigationShowAccessoryView = "RowNavigationShowAccessoryView"
|
||||
static let AccessoryViewRowNavigationStopDisableRow = "rowNavigationStopDisableRow"
|
||||
@@ -44,7 +44,7 @@ class AccessoryViewFormViewController : XLFormViewController {
|
||||
static let AccessoryViewNotes = "notes"
|
||||
}
|
||||
|
||||
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
|
||||
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
|
||||
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
|
||||
initializeForm()
|
||||
}
|
||||
@@ -61,7 +61,7 @@ class AccessoryViewFormViewController : XLFormViewController {
|
||||
var row : XLFormRowDescriptor
|
||||
|
||||
form = XLFormDescriptor(title: "Accessory View")
|
||||
form.rowNavigationOptions = .Enabled
|
||||
form.rowNavigationOptions = .enabled
|
||||
|
||||
// Configuration section
|
||||
section = XLFormSectionDescriptor()
|
||||
@@ -76,25 +76,25 @@ class AccessoryViewFormViewController : XLFormViewController {
|
||||
|
||||
// RowNavigationShowAccessoryView
|
||||
row = XLFormRowDescriptor(tag: Tags.AccessoryViewRowNavigationShowAccessoryView, rowType:XLFormRowDescriptorTypeBooleanCheck, title:"Show input accessory row?")
|
||||
row.value = form.rowNavigationOptions.contains(.Enabled)
|
||||
row.value = form.rowNavigationOptions.contains(.enabled)
|
||||
row.hidden = "$\(Tags.AccessoryViewRowNavigationEnabled) == 0"
|
||||
section.addFormRow(row)
|
||||
|
||||
// RowNavigationStopDisableRow
|
||||
row = XLFormRowDescriptor(tag: Tags.AccessoryViewRowNavigationStopDisableRow, rowType: XLFormRowDescriptorTypeBooleanCheck, title:"Stop when reach disabled row?")
|
||||
row.value = form.rowNavigationOptions.contains(.StopDisableRow)
|
||||
row.value = form.rowNavigationOptions.contains(.stopDisableRow)
|
||||
row.hidden = "$\(Tags.AccessoryViewRowNavigationEnabled) == 0"
|
||||
section.addFormRow(row)
|
||||
|
||||
// RowNavigationStopInlineRow
|
||||
row = XLFormRowDescriptor(tag: Tags.AccessoryViewRowNavigationStopInlineRow, rowType: XLFormRowDescriptorTypeBooleanCheck, title: "Stop when reach inline row?")
|
||||
row.value = form.rowNavigationOptions.contains(.StopInlineRow)
|
||||
row.value = form.rowNavigationOptions.contains(.stopInlineRow)
|
||||
row.hidden = "$\(Tags.AccessoryViewRowNavigationEnabled) == 0"
|
||||
section.addFormRow(row)
|
||||
|
||||
// RowNavigationSkipCanNotBecomeFirstResponderRow
|
||||
row = XLFormRowDescriptor(tag: Tags.AccessoryViewRowNavigationSkipCanNotBecomeFirstResponderRow, rowType:XLFormRowDescriptorTypeBooleanCheck, title:"Skip Can Not Become First Responder Row?")
|
||||
row.value = form.rowNavigationOptions.contains(XLFormRowNavigationOptions.SkipCanNotBecomeFirstResponderRow)
|
||||
row.value = form.rowNavigationOptions.contains(XLFormRowNavigationOptions.skipCanNotBecomeFirstResponderRow)
|
||||
row.hidden = "$\(Tags.AccessoryViewRowNavigationEnabled) == 0"
|
||||
section.addFormRow(row)
|
||||
|
||||
@@ -103,18 +103,18 @@ class AccessoryViewFormViewController : XLFormViewController {
|
||||
|
||||
// Name
|
||||
row = XLFormRowDescriptor(tag: Tags.AccessoryViewName, rowType: XLFormRowDescriptorTypeText, title: "Name")
|
||||
row.required = true
|
||||
row.isRequired = true
|
||||
section.addFormRow(row)
|
||||
|
||||
// Email
|
||||
row = XLFormRowDescriptor(tag: Tags.AccessoryViewEmail, rowType: XLFormRowDescriptorTypeEmail, title: "Email")
|
||||
// validate the email
|
||||
row.addValidator(XLFormValidator.emailValidator())
|
||||
row.addValidator(XLFormValidator.email())
|
||||
section.addFormRow(row)
|
||||
|
||||
// Twitter
|
||||
row = XLFormRowDescriptor(tag: Tags.AccessoryViewTwitter, rowType: XLFormRowDescriptorTypeTwitter, title: "Twitter")
|
||||
row.disabled = NSNumber(bool: true)
|
||||
row.disabled = NSNumber(value: true as Bool)
|
||||
row.value = "@no_editable"
|
||||
section.addFormRow(row)
|
||||
|
||||
@@ -125,7 +125,7 @@ class AccessoryViewFormViewController : XLFormViewController {
|
||||
|
||||
// Date
|
||||
row = XLFormRowDescriptor(tag: Tags.AccessoryViewDate, rowType:XLFormRowDescriptorTypeDateInline, title:"Date Inline")
|
||||
row.value = NSDate()
|
||||
row.value = Date()
|
||||
section.addFormRow(row)
|
||||
|
||||
|
||||
@@ -152,43 +152,43 @@ class AccessoryViewFormViewController : XLFormViewController {
|
||||
}
|
||||
|
||||
|
||||
override func inputAccessoryViewForRowDescriptor(rowDescriptor: XLFormRowDescriptor!) -> UIView! {
|
||||
if form.formRowWithTag(Tags.AccessoryViewRowNavigationShowAccessoryView)!.value!.boolValue == false {
|
||||
override func inputAccessoryView(for rowDescriptor: XLFormRowDescriptor!) -> UIView! {
|
||||
if (form.formRow(withTag: Tags.AccessoryViewRowNavigationShowAccessoryView)!.value! as AnyObject).boolValue == false {
|
||||
return nil
|
||||
}
|
||||
return super.inputAccessoryViewForRowDescriptor(rowDescriptor)
|
||||
return super.inputAccessoryView(for: rowDescriptor)
|
||||
}
|
||||
|
||||
|
||||
//MARK: XLFormDescriptorDelegate
|
||||
|
||||
override func formRowDescriptorValueHasChanged(formRow: XLFormRowDescriptor!, oldValue: AnyObject!, newValue: AnyObject!) {
|
||||
override func formRowDescriptorValueHasChanged(_ formRow: XLFormRowDescriptor!, oldValue: Any!, newValue: Any!) {
|
||||
super.formRowDescriptorValueHasChanged(formRow, oldValue: oldValue, newValue: newValue)
|
||||
if formRow.tag == Tags.AccessoryViewRowNavigationStopDisableRow {
|
||||
if formRow.value!.boolValue == true {
|
||||
form.rowNavigationOptions = form.rowNavigationOptions.union(.StopDisableRow)
|
||||
if (formRow.value! as AnyObject).boolValue == true {
|
||||
form.rowNavigationOptions = form.rowNavigationOptions.union(.stopDisableRow)
|
||||
}
|
||||
else{
|
||||
form.rowNavigationOptions = form.rowNavigationOptions.subtract(.StopDisableRow)
|
||||
form.rowNavigationOptions = form.rowNavigationOptions.subtracting(.stopDisableRow)
|
||||
}
|
||||
}
|
||||
else if formRow.tag == Tags.AccessoryViewRowNavigationStopInlineRow {
|
||||
if formRow.value!.boolValue == true {
|
||||
form.rowNavigationOptions = form.rowNavigationOptions.union(.StopInlineRow)
|
||||
if (formRow.value! as AnyObject).boolValue == true {
|
||||
form.rowNavigationOptions = form.rowNavigationOptions.union(.stopInlineRow)
|
||||
}
|
||||
else{
|
||||
var options = form.rowNavigationOptions
|
||||
options = options.subtract(XLFormRowNavigationOptions.StopInlineRow)
|
||||
options = options.subtracting(XLFormRowNavigationOptions.stopInlineRow)
|
||||
form.rowNavigationOptions = options
|
||||
}
|
||||
}
|
||||
else if formRow.tag == Tags.AccessoryViewRowNavigationSkipCanNotBecomeFirstResponderRow {
|
||||
if formRow.value!.boolValue == true {
|
||||
form.rowNavigationOptions = form.rowNavigationOptions.union(.SkipCanNotBecomeFirstResponderRow)
|
||||
if (formRow.value! as AnyObject).boolValue == true {
|
||||
form.rowNavigationOptions = form.rowNavigationOptions.union(.skipCanNotBecomeFirstResponderRow)
|
||||
}
|
||||
else{
|
||||
var options = form.rowNavigationOptions
|
||||
options = options.subtract(.SkipCanNotBecomeFirstResponderRow)
|
||||
options = options.subtracting(.skipCanNotBecomeFirstResponderRow)
|
||||
form.rowNavigationOptions = options
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,7 +14,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
|
||||
var window: UIWindow?
|
||||
|
||||
|
||||
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
|
||||
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
|
||||
|
||||
// Declare custom rows
|
||||
XLFormViewController.cellClassesForRowDescriptorTypes()[XLFormRowDescriptorTypeRate] = "XLFormRatingCell"
|
||||
@@ -25,9 +25,9 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
|
||||
XLFormViewController.inlineRowDescriptorTypesForRowDescriptorTypes()[XLFormRowDescriptorTypeSegmentedInline] = XLFormRowDescriptorTypeSegmentedControl
|
||||
|
||||
// Override point for customization after application launch.
|
||||
self.window = UIWindow.init(frame: UIScreen.mainScreen().bounds)
|
||||
self.window = UIWindow.init(frame: UIScreen.main.bounds)
|
||||
// Override point for customization after application launch.
|
||||
self.window!.backgroundColor = .whiteColor()
|
||||
self.window!.backgroundColor = .white
|
||||
|
||||
// load the initial form form Storybiard
|
||||
let storyboard = UIStoryboard.init(name:"iPhoneStoryboard", bundle:nil)
|
||||
@@ -36,25 +36,25 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
|
||||
return true
|
||||
}
|
||||
|
||||
func applicationWillResignActive(application: UIApplication) {
|
||||
func applicationWillResignActive(_ application: UIApplication) {
|
||||
// Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
|
||||
// Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
|
||||
}
|
||||
|
||||
func applicationDidEnterBackground(application: UIApplication) {
|
||||
func applicationDidEnterBackground(_ application: UIApplication) {
|
||||
// Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
|
||||
// If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
|
||||
}
|
||||
|
||||
func applicationWillEnterForeground(application: UIApplication) {
|
||||
func applicationWillEnterForeground(_ application: UIApplication) {
|
||||
// Called as part of the transition from the background to the inactive state here you can undo many of the changes made on entering the background.
|
||||
}
|
||||
|
||||
func applicationDidBecomeActive(application: UIApplication) {
|
||||
func applicationDidBecomeActive(_ application: UIApplication) {
|
||||
// Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
|
||||
}
|
||||
|
||||
func applicationWillTerminate(application: UIApplication) {
|
||||
func applicationWillTerminate(_ application: UIApplication) {
|
||||
// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
|
||||
}
|
||||
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
|
||||
class CustomRowsViewController : XLFormViewController {
|
||||
|
||||
private struct Tags {
|
||||
fileprivate struct Tags {
|
||||
static let CustomRowFirstRatingTag = "CustomRowFirstRatingTag"
|
||||
static let CustomRowSecondRatingTag = "CustomRowSecondRatingTag"
|
||||
static let CustomRowFloatLabeledTextFieldTag = "CustomRowFloatLabeledTextFieldTag"
|
||||
@@ -33,7 +33,7 @@ class CustomRowsViewController : XLFormViewController {
|
||||
static let CustomRowInline = "CustomRowInline"
|
||||
}
|
||||
|
||||
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
|
||||
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
|
||||
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
|
||||
self.initializeForm()
|
||||
}
|
||||
@@ -64,7 +64,7 @@ class CustomRowsViewController : XLFormViewController {
|
||||
section.addFormRow(row)
|
||||
|
||||
// Section Float Labeled Text Field
|
||||
section = XLFormSectionDescriptor.formSectionWithTitle("Float Labeled Text Field")
|
||||
section = XLFormSectionDescriptor.formSection(withTitle: "Float Labeled Text Field")
|
||||
form.addFormSection(section)
|
||||
|
||||
row = XLFormRowDescriptor(tag: Tags.CustomRowFloatLabeledTextFieldTag, rowType: XLFormRowDescriptorTypeFloatLabeledTextField, title: "Title")
|
||||
@@ -77,23 +77,23 @@ class CustomRowsViewController : XLFormViewController {
|
||||
section.addFormRow(row)
|
||||
|
||||
|
||||
section = XLFormSectionDescriptor.formSectionWithTitle("Weekdays")
|
||||
section = XLFormSectionDescriptor.formSection(withTitle: "Weekdays")
|
||||
form.addFormSection(section)
|
||||
|
||||
// WeekDays
|
||||
row = XLFormRowDescriptor(tag: Tags.CustomRowWeekdays, rowType: XLFormRowDescriptorTypeWeekDays)
|
||||
row.value = [
|
||||
XLFormWeekDaysCell.kWeekDay.Sunday.description(): false,
|
||||
XLFormWeekDaysCell.kWeekDay.Monday.description(): true,
|
||||
XLFormWeekDaysCell.kWeekDay.Tuesday.description(): true,
|
||||
XLFormWeekDaysCell.kWeekDay.Wednesday.description(): false,
|
||||
XLFormWeekDaysCell.kWeekDay.Thursday.description(): false,
|
||||
XLFormWeekDaysCell.kWeekDay.Friday.description(): false,
|
||||
XLFormWeekDaysCell.kWeekDay.Saturday.description(): false
|
||||
XLFormWeekDaysCell.kWeekDay.sunday.description(): false,
|
||||
XLFormWeekDaysCell.kWeekDay.monday.description(): true,
|
||||
XLFormWeekDaysCell.kWeekDay.tuesday.description(): true,
|
||||
XLFormWeekDaysCell.kWeekDay.wednesday.description(): false,
|
||||
XLFormWeekDaysCell.kWeekDay.thursday.description(): false,
|
||||
XLFormWeekDaysCell.kWeekDay.friday.description(): false,
|
||||
XLFormWeekDaysCell.kWeekDay.saturday.description(): false
|
||||
]
|
||||
section.addFormRow(row)
|
||||
|
||||
section = XLFormSectionDescriptor.formSectionWithTitle("Custom inline row")
|
||||
section = XLFormSectionDescriptor.formSection(withTitle: "Custom inline row")
|
||||
form.addFormSection(section)
|
||||
|
||||
// Inline
|
||||
|
||||
+20
-20
@@ -35,9 +35,9 @@ class FloatLabeledTextFieldCell : XLFormBaseCell, UITextFieldDelegate {
|
||||
lazy var floatLabeledTextField: JVFloatLabeledTextField = {
|
||||
let result = JVFloatLabeledTextField(frame: CGRect.zero)
|
||||
result.translatesAutoresizingMaskIntoConstraints = false
|
||||
result.font = UIFont.systemFontOfSize(kFontSize)
|
||||
result.floatingLabel.font = .boldSystemFontOfSize(kFontSize)
|
||||
result.clearButtonMode = .WhileEditing
|
||||
result.font = UIFont.systemFont(ofSize: kFontSize)
|
||||
result.floatingLabel.font = .boldSystemFont(ofSize: kFontSize)
|
||||
result.clearButtonMode = .whileEditing
|
||||
return result
|
||||
}()
|
||||
|
||||
@@ -45,7 +45,7 @@ class FloatLabeledTextFieldCell : XLFormBaseCell, UITextFieldDelegate {
|
||||
|
||||
override func configure() {
|
||||
super.configure()
|
||||
selectionStyle = .None
|
||||
selectionStyle = .none
|
||||
contentView.addSubview(self.floatLabeledTextField)
|
||||
floatLabeledTextField.delegate = self
|
||||
contentView.addConstraints(layoutConstraints())
|
||||
@@ -54,15 +54,15 @@ class FloatLabeledTextFieldCell : XLFormBaseCell, UITextFieldDelegate {
|
||||
override func update() {
|
||||
super.update()
|
||||
if let rowDescriptor = rowDescriptor {
|
||||
floatLabeledTextField.attributedPlaceholder = NSAttributedString(string: rowDescriptor.title ?? "" , attributes: [NSForegroundColorAttributeName: UIColor.lightGrayColor()])
|
||||
floatLabeledTextField.attributedPlaceholder = NSAttributedString(string: rowDescriptor.title ?? "" , attributes: [NSForegroundColorAttributeName: UIColor.lightGray])
|
||||
if let value = rowDescriptor.value {
|
||||
floatLabeledTextField.text = value.displayText()
|
||||
floatLabeledTextField.text = (value as AnyObject).displayText()
|
||||
}
|
||||
else {
|
||||
floatLabeledTextField.text = rowDescriptor.noValueDisplayText
|
||||
}
|
||||
floatLabeledTextField.enabled = !rowDescriptor.isDisabled()
|
||||
floatLabeledTextField.floatingLabelTextColor = .lightGrayColor()
|
||||
floatLabeledTextField.isEnabled = !rowDescriptor.isDisabled()
|
||||
floatLabeledTextField.floatingLabelTextColor = .lightGray
|
||||
floatLabeledTextField.alpha = rowDescriptor.isDisabled() ? 0.6 : 1.0
|
||||
}
|
||||
}
|
||||
@@ -76,7 +76,7 @@ class FloatLabeledTextFieldCell : XLFormBaseCell, UITextFieldDelegate {
|
||||
return self.floatLabeledTextField.becomeFirstResponder()
|
||||
}
|
||||
|
||||
override static func formDescriptorCellHeightForRowDescriptor(rowDescriptor: XLFormRowDescriptor!) -> CGFloat {
|
||||
override static func formDescriptorCellHeight(for rowDescriptor: XLFormRowDescriptor!) -> CGFloat {
|
||||
return 55.0
|
||||
}
|
||||
|
||||
@@ -86,12 +86,12 @@ class FloatLabeledTextFieldCell : XLFormBaseCell, UITextFieldDelegate {
|
||||
func layoutConstraints() -> [NSLayoutConstraint]{
|
||||
let views = ["floatLabeledTextField" : floatLabeledTextField]
|
||||
let metrics = ["hMargin": 15.0, "vMargin": 8.0]
|
||||
var result = NSLayoutConstraint.constraintsWithVisualFormat("H:|-(hMargin)-[floatLabeledTextField]-(hMargin)-|", options:.AlignAllCenterY, metrics:metrics, views:views)
|
||||
result += NSLayoutConstraint.constraintsWithVisualFormat("V:|-(vMargin)-[floatLabeledTextField]-(vMargin)-|", options:.AlignAllCenterX, metrics:metrics, views:views)
|
||||
var result = NSLayoutConstraint.constraints(withVisualFormat: "H:|-(hMargin)-[floatLabeledTextField]-(hMargin)-|", options:.alignAllCenterY, metrics:metrics, views:views)
|
||||
result += NSLayoutConstraint.constraints(withVisualFormat: "V:|-(vMargin)-[floatLabeledTextField]-(vMargin)-|", options:.alignAllCenterX, metrics:metrics, views:views)
|
||||
return result
|
||||
}
|
||||
|
||||
func textFieldDidChange(textField : UITextField) {
|
||||
func textFieldDidChange(_ textField : UITextField) {
|
||||
if floatLabeledTextField == textField {
|
||||
if let rowDescriptor = rowDescriptor, let text = self.floatLabeledTextField.text {
|
||||
if text.isEmpty == false {
|
||||
@@ -105,34 +105,34 @@ class FloatLabeledTextFieldCell : XLFormBaseCell, UITextFieldDelegate {
|
||||
|
||||
//Mark: UITextFieldDelegate
|
||||
|
||||
func textFieldShouldClear(textField: UITextField) -> Bool {
|
||||
func textFieldShouldClear(_ textField: UITextField) -> Bool {
|
||||
return self.formViewController().textFieldShouldClear(textField)
|
||||
}
|
||||
|
||||
func textFieldShouldReturn(textField: UITextField) -> Bool {
|
||||
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
|
||||
return self.formViewController().textFieldShouldReturn(textField)
|
||||
}
|
||||
|
||||
func textFieldShouldBeginEditing(textField: UITextField) -> Bool {
|
||||
func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
|
||||
return self.formViewController().textFieldShouldBeginEditing(textField)
|
||||
}
|
||||
|
||||
|
||||
func textFieldShouldEndEditing(textField: UITextField) -> Bool {
|
||||
func textFieldShouldEndEditing(_ textField: UITextField) -> Bool {
|
||||
return self.formViewController().textFieldShouldEndEditing(textField)
|
||||
}
|
||||
|
||||
|
||||
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
|
||||
return self.formViewController().textField(textField, shouldChangeCharactersInRange: range, replacementString: string)
|
||||
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
|
||||
return self.formViewController().textField(textField, shouldChangeCharactersIn: range, replacementString: string)
|
||||
}
|
||||
|
||||
func textFieldDidBeginEditing(textField: UITextField) {
|
||||
func textFieldDidBeginEditing(_ textField: UITextField) {
|
||||
self.formViewController().textFieldDidBeginEditing(textField)
|
||||
}
|
||||
|
||||
|
||||
func textFieldDidEndEditing(textField: UITextField) {
|
||||
func textFieldDidEndEditing(_ textField: UITextField) {
|
||||
self.textFieldDidChange(textField)
|
||||
self.formViewController().textFieldDidEndEditing(textField)
|
||||
}
|
||||
|
||||
+27
-27
@@ -14,18 +14,18 @@ let XLFormRowDescriptorTypeSegmentedControl = "XLFormRowDescriptorTypeSegmentedC
|
||||
|
||||
class InlineSegmentedCell : XLFormBaseCell {
|
||||
|
||||
override func canBecomeFirstResponder() -> Bool {
|
||||
override var canBecomeFirstResponder : Bool {
|
||||
return true
|
||||
}
|
||||
|
||||
override func becomeFirstResponder() -> Bool {
|
||||
if isFirstResponder() {
|
||||
if isFirstResponder {
|
||||
return super.becomeFirstResponder()
|
||||
}
|
||||
let result = super.becomeFirstResponder()
|
||||
if result {
|
||||
let inlineRowDescriptor : XLFormRowDescriptor = XLFormRowDescriptor(tag: nil, rowType: XLFormViewController.inlineRowDescriptorTypesForRowDescriptorTypes()![rowDescriptor!.rowType] as! String)
|
||||
let cell = inlineRowDescriptor.cellForFormController(formViewController())
|
||||
let cell = inlineRowDescriptor.cell(forForm: formViewController())
|
||||
let inlineCell = cell as? XLFormInlineRowDescriptorCell
|
||||
inlineCell?.inlineRowDescriptor = rowDescriptor
|
||||
rowDescriptor?.sectionDescriptor.addFormRow(inlineRowDescriptor, afterRow: rowDescriptor!)
|
||||
@@ -35,13 +35,13 @@ class InlineSegmentedCell : XLFormBaseCell {
|
||||
}
|
||||
|
||||
override func resignFirstResponder() -> Bool {
|
||||
if isFirstResponder() {
|
||||
if !isFirstResponder {
|
||||
return super.resignFirstResponder()
|
||||
}
|
||||
let selectedRowPath : NSIndexPath = formViewController().form.indexPathOfFormRow(rowDescriptor!)!
|
||||
let nextRowPath = NSIndexPath(forRow: selectedRowPath.row + 1, inSection: selectedRowPath.section)
|
||||
let nextFormRow = formViewController().form.formRowAtIndex(nextRowPath)
|
||||
let section : XLFormSectionDescriptor = formViewController().form.formSectionAtIndex(UInt(nextRowPath.section))!
|
||||
let selectedRowPath : IndexPath = formViewController().form.indexPath(ofFormRow: rowDescriptor!)!
|
||||
let nextRowPath = IndexPath(row: (selectedRowPath as NSIndexPath).row + 1, section: (selectedRowPath as NSIndexPath).section)
|
||||
let nextFormRow = formViewController().form.formRow(atIndex: nextRowPath)
|
||||
let section : XLFormSectionDescriptor = formViewController().form.formSection(at: UInt((nextRowPath as NSIndexPath).section))!
|
||||
let result = super.resignFirstResponder()
|
||||
if result {
|
||||
section.removeFormRow(nextFormRow!)
|
||||
@@ -56,7 +56,7 @@ class InlineSegmentedCell : XLFormBaseCell {
|
||||
}
|
||||
|
||||
override func formDescriptorCellBecomeFirstResponder() -> Bool {
|
||||
if isFirstResponder() {
|
||||
if isFirstResponder {
|
||||
resignFirstResponder()
|
||||
return false
|
||||
}
|
||||
@@ -65,20 +65,20 @@ class InlineSegmentedCell : XLFormBaseCell {
|
||||
|
||||
override func update() {
|
||||
super.update()
|
||||
accessoryType = .None
|
||||
editingAccessoryType = .None
|
||||
selectionStyle = .None
|
||||
accessoryType = .none
|
||||
editingAccessoryType = .none
|
||||
selectionStyle = .none
|
||||
textLabel?.text = rowDescriptor?.title
|
||||
detailTextLabel?.text = valueDisplayText()
|
||||
}
|
||||
|
||||
override func formDescriptorCellDidSelectedWithFormController(controller: XLFormViewController!) {
|
||||
controller.tableView.deselectRowAtIndexPath(controller.form.indexPathOfFormRow(rowDescriptor!)!, animated: true)
|
||||
override func formDescriptorCellDidSelected(withForm controller: XLFormViewController!) {
|
||||
controller.tableView.deselectRow(at: controller.form.indexPath(ofFormRow: rowDescriptor!)!, animated: true)
|
||||
}
|
||||
|
||||
func valueDisplayText() -> String? {
|
||||
if let value = rowDescriptor?.value {
|
||||
return value.displayText()
|
||||
return (value as AnyObject).displayText()
|
||||
}
|
||||
return rowDescriptor?.noValueDisplayText
|
||||
}
|
||||
@@ -93,17 +93,17 @@ class InlineSegmentedControl : XLFormBaseCell, XLFormInlineRowDescriptorCell {
|
||||
|
||||
override func configure() {
|
||||
super.configure()
|
||||
selectionStyle = .None
|
||||
selectionStyle = .none
|
||||
contentView.addSubview(segmentedControl)
|
||||
contentView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-[segmentedControl]-|", options: .AlignAllCenterY, metrics: nil, views: ["segmentedControl": segmentedControl]))
|
||||
segmentedControl.addTarget(self, action: "valueChanged", forControlEvents: .ValueChanged)
|
||||
contentView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|-[segmentedControl]-|", options: .alignAllCenterY, metrics: nil, views: ["segmentedControl": segmentedControl]))
|
||||
segmentedControl.addTarget(self, action: #selector(InlineSegmentedControl.valueChanged), for: .valueChanged)
|
||||
}
|
||||
|
||||
override func update() {
|
||||
super.update()
|
||||
updateSegmentedControl()
|
||||
segmentedControl.selectedSegmentIndex = selectedIndex()
|
||||
segmentedControl.enabled = rowDescriptor?.isDisabled() == false
|
||||
segmentedControl.isEnabled = rowDescriptor?.isDisabled() == false
|
||||
}
|
||||
|
||||
//MARK: Actions
|
||||
@@ -118,27 +118,27 @@ class InlineSegmentedControl : XLFormBaseCell, XLFormInlineRowDescriptorCell {
|
||||
func getItems() -> NSMutableArray {
|
||||
let result = NSMutableArray()
|
||||
for option in inlineRowDescriptor!.selectorOptions! {
|
||||
result.addObject(option.displayText())
|
||||
result.add((option as AnyObject).displayText())
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
func updateSegmentedControl() {
|
||||
segmentedControl.removeAllSegments()
|
||||
getItems().enumerateObjectsUsingBlock { [weak self] object, index, stop in
|
||||
self?.segmentedControl.insertSegmentWithTitle(object.displayText(), atIndex: index, animated: false)
|
||||
}
|
||||
getItems().enumerateObjects({ [weak self] (object, index, stop) in
|
||||
self?.segmentedControl.insertSegment(withTitle: (object as AnyObject).displayText(), at: index, animated: false)
|
||||
})
|
||||
}
|
||||
|
||||
func selectedIndex() -> Int {
|
||||
let formRow = inlineRowDescriptor ?? rowDescriptor
|
||||
if let value = formRow?.value {
|
||||
if let value = formRow?.value as? NSObject {
|
||||
for option in (formRow?.selectorOptions)! {
|
||||
if option.valueData().isEqual(value.valueData()){
|
||||
return formRow?.selectorOptions?.indexOf({ $0.isEqual(option) }) ?? -1
|
||||
if ((option as! NSObject).valueData() as AnyObject) === (value.valueData() as AnyObject) {
|
||||
return formRow?.selectorOptions?.index(where: { ($0 as! NSObject) == (option as! NSObject) } ) ?? -1
|
||||
}
|
||||
}
|
||||
}
|
||||
return -1
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -39,7 +39,7 @@ class XLRatingView : AXRatingView {
|
||||
func customize() {
|
||||
baseColor = UIColor(red: (205/255.0), green: (201/255.0), blue: (201/255.0), alpha: 1)
|
||||
highlightColor = UIColor(red: (255/255.0), green: (215/255.0), blue: 0, alpha: 1)
|
||||
markFont = UIFont.systemFontOfSize(23.0)
|
||||
markFont = UIFont.systemFont(ofSize: 23.0)
|
||||
stepInterval = 1.0
|
||||
}
|
||||
|
||||
|
||||
@@ -34,14 +34,14 @@ class XLFormRatingCell : XLFormBaseCell {
|
||||
|
||||
override func configure() {
|
||||
super.configure()
|
||||
selectionStyle = .None
|
||||
ratingView.addTarget(self, action: "rateChanged:", forControlEvents:.ValueChanged)
|
||||
selectionStyle = .none
|
||||
ratingView.addTarget(self, action: #selector(XLFormRatingCell.rateChanged(_:)), for:.valueChanged)
|
||||
}
|
||||
|
||||
|
||||
override func update() {
|
||||
super.update()
|
||||
ratingView.value = rowDescriptor!.value!.floatValue
|
||||
ratingView.value = (rowDescriptor!.value! as AnyObject).floatValue
|
||||
rateTitle.text = rowDescriptor!.title
|
||||
ratingView.alpha = rowDescriptor!.isDisabled() ? 0.6 : 1
|
||||
rateTitle.alpha = rowDescriptor!.isDisabled() ? 0.6 : 1
|
||||
@@ -49,7 +49,7 @@ class XLFormRatingCell : XLFormBaseCell {
|
||||
|
||||
//MARK: Events
|
||||
|
||||
func rateChanged(ratingView : XLRatingView){
|
||||
func rateChanged(_ ratingView : XLRatingView){
|
||||
rowDescriptor!.value = ratingView.value
|
||||
}
|
||||
|
||||
|
||||
@@ -30,29 +30,29 @@ class XLFormWeekDaysCell : XLFormBaseCell {
|
||||
|
||||
enum kWeekDay: Int {
|
||||
case
|
||||
Sunday = 1,
|
||||
Monday,
|
||||
Tuesday,
|
||||
Wednesday,
|
||||
Thursday,
|
||||
Friday,
|
||||
Saturday
|
||||
sunday = 1,
|
||||
monday,
|
||||
tuesday,
|
||||
wednesday,
|
||||
thursday,
|
||||
friday,
|
||||
saturday
|
||||
|
||||
func description() -> String {
|
||||
switch self {
|
||||
case .Sunday:
|
||||
case .sunday:
|
||||
return "Sunday"
|
||||
case .Monday:
|
||||
case .monday:
|
||||
return "Monday"
|
||||
case .Tuesday:
|
||||
case .tuesday:
|
||||
return "Tuesday"
|
||||
case .Wednesday:
|
||||
case .wednesday:
|
||||
return "Wednesday"
|
||||
case .Thursday:
|
||||
case .thursday:
|
||||
return "Thursday"
|
||||
case .Friday:
|
||||
case .friday:
|
||||
return "Friday"
|
||||
case .Saturday:
|
||||
case .saturday:
|
||||
return "Saturday"
|
||||
}
|
||||
}
|
||||
@@ -60,13 +60,13 @@ class XLFormWeekDaysCell : XLFormBaseCell {
|
||||
//Add Custom Functions
|
||||
|
||||
//Allows for iteration as needed (for in ...)
|
||||
static let allValues = [Sunday,
|
||||
Monday,
|
||||
Tuesday,
|
||||
Wednesday,
|
||||
Thursday,
|
||||
Friday,
|
||||
Saturday]
|
||||
static let allValues = [sunday,
|
||||
monday,
|
||||
tuesday,
|
||||
wednesday,
|
||||
thursday,
|
||||
friday,
|
||||
saturday]
|
||||
}
|
||||
|
||||
@IBOutlet weak var sundayButton: UIButton!
|
||||
@@ -81,7 +81,7 @@ class XLFormWeekDaysCell : XLFormBaseCell {
|
||||
|
||||
override func configure() {
|
||||
super.configure()
|
||||
selectionStyle = .None
|
||||
selectionStyle = .none
|
||||
configureButtons()
|
||||
}
|
||||
|
||||
@@ -91,17 +91,17 @@ class XLFormWeekDaysCell : XLFormBaseCell {
|
||||
updateButtons()
|
||||
}
|
||||
|
||||
override static func formDescriptorCellHeightForRowDescriptor(rowDescriptor: XLFormRowDescriptor!) -> CGFloat {
|
||||
override static func formDescriptorCellHeight(for rowDescriptor: XLFormRowDescriptor!) -> CGFloat {
|
||||
return 60
|
||||
}
|
||||
|
||||
//MARK: - Action
|
||||
|
||||
@IBAction func dayTapped(sender: UIButton) {
|
||||
@IBAction func dayTapped(_ sender: UIButton) {
|
||||
let day = getDayFormButton(sender)
|
||||
sender.selected = !sender.selected
|
||||
sender.isSelected = !sender.isSelected
|
||||
var newValue = rowDescriptor!.value as! Dictionary<String, Bool>
|
||||
newValue[day] = sender.selected
|
||||
newValue[day] = sender.isSelected
|
||||
rowDescriptor!.value = newValue
|
||||
}
|
||||
|
||||
@@ -110,8 +110,8 @@ class XLFormWeekDaysCell : XLFormBaseCell {
|
||||
func configureButtons() {
|
||||
for subview in contentView.subviews {
|
||||
if let button = subview as? UIButton {
|
||||
button.setImage(UIImage(named: "uncheckedDay"), forState: .Normal)
|
||||
button.setImage(UIImage(named: "checkedDay"), forState: .Selected)
|
||||
button.setImage(UIImage(named: "uncheckedDay"), for: UIControlState())
|
||||
button.setImage(UIImage(named: "checkedDay"), for: .selected)
|
||||
button.adjustsImageWhenHighlighted = false
|
||||
imageTopTitleBottom(button)
|
||||
}
|
||||
@@ -122,13 +122,13 @@ class XLFormWeekDaysCell : XLFormBaseCell {
|
||||
func updateButtons() {
|
||||
var value = rowDescriptor!.value as! Dictionary<String, Bool>
|
||||
|
||||
sundayButton.selected = value[kWeekDay.Sunday.description()]!
|
||||
mondayButton.selected = value[kWeekDay.Monday.description()]!
|
||||
tuesdayButton.selected = value[kWeekDay.Tuesday.description()]!
|
||||
wednesdayButton.selected = value[kWeekDay.Wednesday.description()]!
|
||||
thursdayButton.selected = value[kWeekDay.Thursday.description()]!
|
||||
fridayButton.selected = value[kWeekDay.Friday.description()]!
|
||||
saturdayButton.selected = value[kWeekDay.Saturday.description()]!
|
||||
sundayButton.isSelected = value[kWeekDay.sunday.description()]!
|
||||
mondayButton.isSelected = value[kWeekDay.monday.description()]!
|
||||
tuesdayButton.isSelected = value[kWeekDay.tuesday.description()]!
|
||||
wednesdayButton.isSelected = value[kWeekDay.wednesday.description()]!
|
||||
thursdayButton.isSelected = value[kWeekDay.thursday.description()]!
|
||||
fridayButton.isSelected = value[kWeekDay.friday.description()]!
|
||||
saturdayButton.isSelected = value[kWeekDay.saturday.description()]!
|
||||
|
||||
sundayButton.alpha = rowDescriptor!.isDisabled() ? 0.6 : 1
|
||||
mondayButton.alpha = mondayButton.alpha
|
||||
@@ -139,7 +139,7 @@ class XLFormWeekDaysCell : XLFormBaseCell {
|
||||
saturdayButton.alpha = mondayButton.alpha
|
||||
}
|
||||
|
||||
func imageTopTitleBottom(button: UIButton) {
|
||||
func imageTopTitleBottom(_ button: UIButton) {
|
||||
// the space between the image and text
|
||||
let spacing : CGFloat = 3.0
|
||||
|
||||
@@ -150,26 +150,26 @@ 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).sizeWithAttributes([NSFontAttributeName: button.titleLabel!.font])
|
||||
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)
|
||||
}
|
||||
|
||||
func getDayFormButton(button: UIButton) -> String {
|
||||
func getDayFormButton(_ button: UIButton) -> String {
|
||||
switch button {
|
||||
case sundayButton:
|
||||
return kWeekDay.Sunday.description()
|
||||
return kWeekDay.sunday.description()
|
||||
case mondayButton:
|
||||
return kWeekDay.Monday.description()
|
||||
return kWeekDay.monday.description()
|
||||
case tuesdayButton:
|
||||
return kWeekDay.Tuesday.description()
|
||||
return kWeekDay.tuesday.description()
|
||||
case wednesdayButton:
|
||||
return kWeekDay.Wednesday.description()
|
||||
return kWeekDay.wednesday.description()
|
||||
case thursdayButton:
|
||||
return kWeekDay.Thursday.description()
|
||||
return kWeekDay.thursday.description()
|
||||
case fridayButton:
|
||||
return kWeekDay.Friday.description()
|
||||
return kWeekDay.friday.description()
|
||||
default:
|
||||
return kWeekDay.Saturday.description()
|
||||
return kWeekDay.saturday.description()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -28,12 +28,12 @@ import MapKit
|
||||
|
||||
class CustomSelectorsFormViewController : XLFormViewController {
|
||||
|
||||
private struct Tags {
|
||||
fileprivate struct Tags {
|
||||
static let SelectorMap = "selectorMap"
|
||||
static let SelectorMapPopover = "selectorMapPopover"
|
||||
}
|
||||
|
||||
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
|
||||
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
|
||||
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
|
||||
initializeForm()
|
||||
}
|
||||
@@ -51,7 +51,7 @@ class CustomSelectorsFormViewController : XLFormViewController {
|
||||
|
||||
form = XLFormDescriptor(title: "Custom Selectors")
|
||||
|
||||
section = XLFormSectionDescriptor.formSectionWithTitle("TextField Types")
|
||||
section = XLFormSectionDescriptor.formSection(withTitle: "TextField Types")
|
||||
section.footerTitle = "CustomSelectorsFormViewController.swift"
|
||||
form.addFormSection(section)
|
||||
|
||||
@@ -62,7 +62,7 @@ class CustomSelectorsFormViewController : XLFormViewController {
|
||||
row.value = CLLocation(latitude: -33, longitude: -56)
|
||||
section.addFormRow(row)
|
||||
|
||||
if UIDevice.currentDevice().userInterfaceIdiom == .Pad {
|
||||
if UIDevice.current.userInterfaceIdiom == .pad {
|
||||
// Selector PopOver
|
||||
row = XLFormRowDescriptor(tag: Tags.SelectorMapPopover, rowType: XLFormRowDescriptorTypeSelectorPopover, title: "Coordinate PopOver")
|
||||
row.action.viewControllerClass = MapViewController.self
|
||||
|
||||
+2
-2
@@ -26,7 +26,7 @@
|
||||
|
||||
import MapKit
|
||||
|
||||
class CLLocationValueTrasformer : NSValueTransformer {
|
||||
class CLLocationValueTrasformer : ValueTransformer {
|
||||
|
||||
override class func transformedValueClass() -> AnyClass {
|
||||
return NSString.self
|
||||
@@ -37,7 +37,7 @@ class CLLocationValueTrasformer : NSValueTransformer {
|
||||
return false
|
||||
}
|
||||
|
||||
override func transformedValue(value: AnyObject?) -> AnyObject? {
|
||||
override func transformedValue(_ value: Any?) -> Any? {
|
||||
if let valueData = value, let location = valueData as? CLLocation{
|
||||
return String(format: "%0.4f, %0.4f", location.coordinate.latitude, location.coordinate.longitude)
|
||||
}
|
||||
|
||||
+8
-8
@@ -42,11 +42,11 @@ 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 = [UIViewAutoresizing.flexibleHeight, UIViewAutoresizing.flexibleWidth]
|
||||
return mapView
|
||||
}()
|
||||
|
||||
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
|
||||
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
|
||||
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
|
||||
}
|
||||
|
||||
@@ -60,7 +60,7 @@ class MapViewController : UIViewController, XLFormRowDescriptorViewController, M
|
||||
view.addSubview(mapView)
|
||||
mapView.delegate = self
|
||||
if let value = rowDescriptor?.value as? CLLocation {
|
||||
mapView.setCenterCoordinate(value.coordinate, animated: false)
|
||||
mapView.setCenter(value.coordinate, animated: false)
|
||||
title = String(format: "%0.4f, %0.4f", mapView.centerCoordinate.latitude, mapView.centerCoordinate.longitude)
|
||||
let annotation = MapAnnotation()
|
||||
annotation.coordinate = value.coordinate
|
||||
@@ -70,18 +70,18 @@ class MapViewController : UIViewController, XLFormRowDescriptorViewController, M
|
||||
|
||||
//MARK - - MKMapViewDelegate
|
||||
|
||||
func mapView(mapView: MKMapView, viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView? {
|
||||
func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
|
||||
|
||||
let pinAnnotationView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: "annotation")
|
||||
pinAnnotationView.pinColor = MKPinAnnotationColor.Red
|
||||
pinAnnotationView.draggable = true
|
||||
pinAnnotationView.pinColor = MKPinAnnotationColor.red
|
||||
pinAnnotationView.isDraggable = true
|
||||
pinAnnotationView.animatesDrop = true
|
||||
return pinAnnotationView
|
||||
}
|
||||
|
||||
|
||||
func mapView(mapView: MKMapView, annotationView view: MKAnnotationView, didChangeDragState newState: MKAnnotationViewDragState, fromOldState oldState: MKAnnotationViewDragState) {
|
||||
if (newState == .Ending){
|
||||
func mapView(_ mapView: MKMapView, annotationView view: MKAnnotationView, didChange newState: MKAnnotationViewDragState, fromOldState oldState: MKAnnotationViewDragState) {
|
||||
if (newState == .ending){
|
||||
if let rowDescriptor = rowDescriptor, let annotation = view.annotation {
|
||||
rowDescriptor.value = CLLocation(latitude:annotation.coordinate.latitude, longitude:annotation.coordinate.longitude)
|
||||
self.title = String(format: "%0.4f, %0.4f", annotation.coordinate.latitude, annotation.coordinate.longitude)
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
// THE SOFTWARE.
|
||||
|
||||
class DateValueTrasformer : NSValueTransformer {
|
||||
class DateValueTrasformer : ValueTransformer {
|
||||
|
||||
override class func transformedValueClass() -> AnyClass {
|
||||
return NSString.self
|
||||
@@ -34,18 +34,18 @@ class DateValueTrasformer : NSValueTransformer {
|
||||
return false
|
||||
}
|
||||
|
||||
override func transformedValue(value: AnyObject?) -> AnyObject? {
|
||||
if let date = value as? NSDate {
|
||||
let dateFormatter = NSDateFormatter()
|
||||
dateFormatter.dateStyle = .FullStyle
|
||||
dateFormatter.timeStyle = .NoStyle
|
||||
return dateFormatter.stringFromDate(date)
|
||||
override func transformedValue(_ value: Any?) -> Any? {
|
||||
if let date = value as? Date {
|
||||
let dateFormatter = DateFormatter()
|
||||
dateFormatter.dateStyle = .full
|
||||
dateFormatter.timeStyle = .none
|
||||
return dateFormatter.string(from: date)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
class DateTimeValueTrasformer: NSValueTransformer {
|
||||
class DateTimeValueTrasformer: ValueTransformer {
|
||||
|
||||
override class func transformedValueClass() -> AnyClass {
|
||||
return NSString.self
|
||||
@@ -56,12 +56,12 @@ class DateTimeValueTrasformer: NSValueTransformer {
|
||||
return false
|
||||
}
|
||||
|
||||
override func transformedValue(value: AnyObject?) -> AnyObject? {
|
||||
if let date = value as? NSDate {
|
||||
let dateFormatter = NSDateFormatter()
|
||||
dateFormatter.dateStyle = .MediumStyle
|
||||
dateFormatter.timeStyle = .ShortStyle
|
||||
return dateFormatter.stringFromDate(date)
|
||||
override func transformedValue(_ value: Any?) -> Any? {
|
||||
if let date = value as? Date {
|
||||
let dateFormatter = DateFormatter()
|
||||
dateFormatter.dateStyle = .medium
|
||||
dateFormatter.timeStyle = .short
|
||||
return dateFormatter.string(from: date)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
|
||||
class DatesFormViewController: XLFormViewController {
|
||||
|
||||
private struct Tags {
|
||||
fileprivate struct Tags {
|
||||
static let DateInline = "dateInline"
|
||||
static let TimeInline = "timeInline"
|
||||
static let DateTimeInline = "dateTimeInline"
|
||||
@@ -38,7 +38,7 @@ class DatesFormViewController: XLFormViewController {
|
||||
static let CountDownTimer = "countDownTimer"
|
||||
}
|
||||
|
||||
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
|
||||
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
|
||||
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
|
||||
initializeForm()
|
||||
}
|
||||
@@ -50,15 +50,15 @@ class DatesFormViewController: XLFormViewController {
|
||||
|
||||
override func viewDidLoad() {
|
||||
super.viewDidLoad()
|
||||
let barButton = UIBarButtonItem(title: "Disable", style: .Plain, target: self, action: "disableEnable:")
|
||||
let barButton = UIBarButtonItem(title: "Disable", style: .plain, target: self, action: #selector(DatesFormViewController.disableEnable(_:)))
|
||||
barButton.possibleTitles = Set(["Disable", "Enable"])
|
||||
navigationItem.rightBarButtonItem = barButton
|
||||
}
|
||||
|
||||
|
||||
func disableEnable(button : UIBarButtonItem){
|
||||
form.disabled = !form.disabled
|
||||
button.title = form.disabled ? "Enable" : "Disable"
|
||||
func disableEnable(_ button : UIBarButtonItem){
|
||||
form.isDisabled = !form.isDisabled
|
||||
button.title = form.isDisabled ? "Enable" : "Disable"
|
||||
tableView.endEditing(true)
|
||||
tableView.reloadData()
|
||||
}
|
||||
@@ -70,78 +70,78 @@ class DatesFormViewController: XLFormViewController {
|
||||
|
||||
form = XLFormDescriptor(title: "Date & Time")
|
||||
|
||||
section = XLFormSectionDescriptor.formSectionWithTitle("Inline Dates")
|
||||
section = XLFormSectionDescriptor.formSection(withTitle: "Inline Dates")
|
||||
form.addFormSection(section)
|
||||
|
||||
// Date
|
||||
row = XLFormRowDescriptor(tag: Tags.DateInline, rowType: XLFormRowDescriptorTypeDateInline, title:"Date")
|
||||
row.value = NSDate()
|
||||
row.value = Date()
|
||||
section.addFormRow(row)
|
||||
|
||||
// Time
|
||||
row = XLFormRowDescriptor(tag: Tags.TimeInline, rowType: XLFormRowDescriptorTypeTimeInline, title: "Time")
|
||||
row.value = NSDate()
|
||||
row.value = Date()
|
||||
section.addFormRow(row)
|
||||
|
||||
// DateTime
|
||||
row = XLFormRowDescriptor(tag: Tags.DateTimeInline, rowType: XLFormRowDescriptorTypeDateTimeInline, title: "Date Time")
|
||||
row.value = NSDate()
|
||||
row.value = Date()
|
||||
section.addFormRow(row)
|
||||
|
||||
// CountDownTimer
|
||||
row = XLFormRowDescriptor(tag: Tags.CountDownTimerInline, rowType:XLFormRowDescriptorTypeCountDownTimerInline, title:"Countdown Timer")
|
||||
row.value = NSDate()
|
||||
row.value = Date()
|
||||
section.addFormRow(row)
|
||||
|
||||
|
||||
section = XLFormSectionDescriptor.formSectionWithTitle("Dates") //
|
||||
section = XLFormSectionDescriptor.formSection(withTitle: "Dates") //
|
||||
form.addFormSection(section)
|
||||
|
||||
|
||||
// Date
|
||||
row = XLFormRowDescriptor(tag: Tags.Date, rowType:XLFormRowDescriptorTypeDate, title:"Date")
|
||||
row.value = NSDate()
|
||||
row.cellConfigAtConfigure["minimumDate"] = NSDate()
|
||||
row.cellConfigAtConfigure["maximumDate"] = NSDate(timeIntervalSinceNow: 60*60*24*3)
|
||||
row.value = Date()
|
||||
row.cellConfigAtConfigure["minimumDate"] = Date()
|
||||
row.cellConfigAtConfigure["maximumDate"] = Date(timeIntervalSinceNow: 60*60*24*3)
|
||||
section.addFormRow(row)
|
||||
|
||||
// Time
|
||||
row = XLFormRowDescriptor(tag: Tags.Time, rowType: XLFormRowDescriptorTypeTime, title: "Time")
|
||||
row.cellConfigAtConfigure["minuteInterval"] = 10
|
||||
row.value = NSDate()
|
||||
row.value = Date()
|
||||
section.addFormRow(row)
|
||||
|
||||
// DateTime
|
||||
row = XLFormRowDescriptor(tag: Tags.DateTime, rowType: XLFormRowDescriptorTypeDateTime, title: "Date Time")
|
||||
row.value = NSDate()
|
||||
row.value = Date()
|
||||
section.addFormRow(row)
|
||||
|
||||
// CountDownTimer
|
||||
row = XLFormRowDescriptor(tag: Tags.CountDownTimer, rowType: XLFormRowDescriptorTypeCountDownTimer, title: "Countdown Timer")
|
||||
row.value = NSDate()
|
||||
row.value = Date()
|
||||
section.addFormRow(row)
|
||||
|
||||
|
||||
section = XLFormSectionDescriptor.formSectionWithTitle("Disabled Dates")
|
||||
section = XLFormSectionDescriptor.formSection(withTitle: "Disabled Dates")
|
||||
section.footerTitle = "DatesFormViewController.swift"
|
||||
form.addFormSection(section)
|
||||
|
||||
// Date
|
||||
row = XLFormRowDescriptor(tag: nil, rowType: XLFormRowDescriptorTypeDate, title: "Date")
|
||||
row.disabled = NSNumber(bool: true)
|
||||
row.required = true
|
||||
row.value = NSDate()
|
||||
row.disabled = NSNumber(value: true as Bool)
|
||||
row.isRequired = true
|
||||
row.value = Date()
|
||||
section.addFormRow(row)
|
||||
|
||||
|
||||
|
||||
section = XLFormSectionDescriptor.formSectionWithTitle("DatePicker")
|
||||
section = XLFormSectionDescriptor.formSection(withTitle: "DatePicker")
|
||||
form.addFormSection(section)
|
||||
|
||||
// DatePicker
|
||||
row = XLFormRowDescriptor(tag: Tags.DatePicker, rowType:XLFormRowDescriptorTypeDatePicker)
|
||||
row.cellConfigAtConfigure["datePicker.datePickerMode"] = UIDatePickerMode.Date.rawValue
|
||||
row.value = NSDate()
|
||||
row.cellConfigAtConfigure["datePicker.datePickerMode"] = UIDatePickerMode.date.rawValue
|
||||
row.value = Date()
|
||||
section.addFormRow(row)
|
||||
|
||||
|
||||
@@ -150,8 +150,7 @@ class DatesFormViewController: XLFormViewController {
|
||||
|
||||
|
||||
// MARK: - XLFormDescriptorDelegate
|
||||
|
||||
override func formRowDescriptorValueHasChanged(formRow: XLFormRowDescriptor!, oldValue: AnyObject!, newValue: AnyObject!) {
|
||||
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")
|
||||
|
||||
+3
-3
@@ -25,7 +25,7 @@
|
||||
|
||||
class DynamicSelectorsFormViewController : XLFormViewController {
|
||||
|
||||
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
|
||||
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
|
||||
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
|
||||
initializeForm()
|
||||
}
|
||||
@@ -42,7 +42,7 @@ class DynamicSelectorsFormViewController : XLFormViewController {
|
||||
var row : XLFormRowDescriptor
|
||||
|
||||
// Basic Information
|
||||
section = XLFormSectionDescriptor.formSectionWithTitle("Dynamic Selectors")
|
||||
section = XLFormSectionDescriptor.formSection(withTitle: "Dynamic Selectors")
|
||||
section.footerTitle = "DynamicSelectorsFormViewController.swift"
|
||||
form.addFormSection(section)
|
||||
|
||||
@@ -51,7 +51,7 @@ class DynamicSelectorsFormViewController : XLFormViewController {
|
||||
row.action.viewControllerClass = UsersTableViewController.self
|
||||
section.addFormRow(row)
|
||||
|
||||
if UIDevice.currentDevice().userInterfaceIdiom == .Pad {
|
||||
if UIDevice.current.userInterfaceIdiom == .pad {
|
||||
// Selector PopOver
|
||||
row = XLFormRowDescriptor(tag: "selectorUserPopover", rowType:XLFormRowDescriptorTypeSelectorPopover, title:"User Popover")
|
||||
row.action.viewControllerClass = UsersTableViewController.self
|
||||
|
||||
@@ -38,7 +38,7 @@ class UserCell : UITableViewCell {
|
||||
lazy var userName : UILabel = {
|
||||
let tempUserName = UILabel()
|
||||
tempUserName.translatesAutoresizingMaskIntoConstraints = false
|
||||
tempUserName.font = UIFont.systemFontOfSize(15.0)
|
||||
tempUserName.font = UIFont.systemFont(ofSize: 15.0)
|
||||
return tempUserName
|
||||
}()
|
||||
|
||||
@@ -55,7 +55,7 @@ class UserCell : UITableViewCell {
|
||||
fatalError("init(coder:) has not been implemented")
|
||||
}
|
||||
|
||||
override func setSelected(selected: Bool, animated: Bool) {
|
||||
override func setSelected(_ selected: Bool, animated: Bool) {
|
||||
super.setSelected(selected, animated: animated)
|
||||
|
||||
}
|
||||
@@ -63,11 +63,11 @@ class UserCell : UITableViewCell {
|
||||
// MARK: - Layout Constraints
|
||||
|
||||
func layoutConstraints() -> [NSLayoutConstraint]{
|
||||
let views = ["image": self.userImage, "name": self.userName ]
|
||||
let views = ["image": self.userImage, "name": self.userName ] as [String : Any]
|
||||
let metrics = [ "imgSize": 50.0, "margin": 12.0]
|
||||
|
||||
var result = NSLayoutConstraint.constraintsWithVisualFormat("H:|-(margin)-[image(imgSize)]-[name]", options:.AlignAllTop, metrics: metrics, views: views)
|
||||
result += NSLayoutConstraint.constraintsWithVisualFormat("V:|-(margin)-[image(imgSize)]", options:NSLayoutFormatOptions(), metrics:metrics, views: views)
|
||||
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)
|
||||
return result
|
||||
}
|
||||
|
||||
@@ -91,9 +91,9 @@ class UsersJSONSerialization {
|
||||
"{\"id\":4,\"name\":\"Montgomery Burns\",\"imageName\":\"Montgomery_Burns.png\"}," +
|
||||
"{\"id\":5,\"name\":\"Ned Flanders\",\"imageName\":\"Ned_Flanders.png\"}," +
|
||||
"{\"id\":6,\"name\":\"Otto Mann\",\"imageName\":\"Otto_Mann.png\"}]"
|
||||
let jsonData = dataString.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)
|
||||
let jsonData = dataString.data(using: String.Encoding.utf8, allowLossyConversion: true)
|
||||
do {
|
||||
let result = try NSJSONSerialization.JSONObjectWithData(jsonData!, options: NSJSONReadingOptions()) as! Array<AnyObject>
|
||||
let result = try JSONSerialization.jsonObject(with: jsonData!, options: JSONSerialization.ReadingOptions()) as! Array<AnyObject>
|
||||
return result
|
||||
}
|
||||
catch let error as NSError {
|
||||
@@ -124,9 +124,9 @@ class User: NSObject, XLFormOptionObject {
|
||||
func formDisplayText() -> String {
|
||||
return self.userName
|
||||
}
|
||||
|
||||
func formValue() -> AnyObject {
|
||||
return self.userId
|
||||
|
||||
func formValue() -> Any {
|
||||
return self.userId as Any
|
||||
}
|
||||
|
||||
}
|
||||
@@ -139,14 +139,14 @@ class UsersTableViewController : UITableViewController, XLFormRowDescriptorViewC
|
||||
|
||||
var userCell : UserCell?
|
||||
|
||||
private let kUserCellIdentifier = "UserCell"
|
||||
fileprivate let kUserCellIdentifier = "UserCell"
|
||||
|
||||
|
||||
override init(style: UITableViewStyle) {
|
||||
super.init(style: style);
|
||||
}
|
||||
|
||||
override init(nibName nibNameOrNil: String!, bundle nibBundleOrNil: NSBundle!) {
|
||||
override init(nibName nibNameOrNil: String!, bundle nibBundleOrNil: Bundle!) {
|
||||
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
|
||||
}
|
||||
|
||||
@@ -156,53 +156,53 @@ class UsersTableViewController : UITableViewController, XLFormRowDescriptorViewC
|
||||
|
||||
override func viewDidLoad() {
|
||||
super.viewDidLoad()
|
||||
tableView.registerClass(UserCell.self, forCellReuseIdentifier: kUserCellIdentifier)
|
||||
tableView.register(UserCell.self, forCellReuseIdentifier: kUserCellIdentifier)
|
||||
tableView.tableFooterView = UIView(frame: CGRect.zero)
|
||||
}
|
||||
|
||||
// MARK: UITableViewDataSource
|
||||
|
||||
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
|
||||
override func numberOfSections(in tableView: UITableView) -> Int {
|
||||
return 1
|
||||
}
|
||||
|
||||
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
|
||||
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
|
||||
return UsersJSONSerialization.sharedInstance.userData!.count
|
||||
}
|
||||
|
||||
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
|
||||
let cell: UserCell = tableView.dequeueReusableCellWithIdentifier(self.kUserCellIdentifier, forIndexPath: indexPath) as! UserCell
|
||||
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
|
||||
let cell: UserCell = tableView.dequeueReusableCell(withIdentifier: self.kUserCellIdentifier, for: indexPath) as! UserCell
|
||||
let usersData = UsersJSONSerialization.sharedInstance.userData! as! Array<Dictionary<String, AnyObject>>
|
||||
let userData = usersData[indexPath.row] as Dictionary<String, AnyObject>
|
||||
let userData = usersData[(indexPath as NSIndexPath).row] as Dictionary<String, AnyObject>
|
||||
let userId = userData["id"] as! Int
|
||||
cell.userName.text = userData["name"] as? String
|
||||
cell.userImage.image = UIImage(named: (userData["imageName"] as? String)!)
|
||||
if let value = rowDescriptor?.value {
|
||||
cell.accessoryType = value.formValue().isEqual(userId) ? .Checkmark : .None
|
||||
cell.accessoryType = ((value as? XLFormOptionObject)?.formValue() as? Int) == userId ? .checkmark : .none
|
||||
}
|
||||
return cell;
|
||||
|
||||
}
|
||||
|
||||
override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
|
||||
override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
|
||||
return 73.0
|
||||
}
|
||||
|
||||
|
||||
//MARK: UITableViewDelegate
|
||||
|
||||
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
|
||||
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
|
||||
|
||||
let usersData = UsersJSONSerialization.sharedInstance.userData! as! Array<Dictionary<String, AnyObject>>
|
||||
let userData = usersData[indexPath.row] as Dictionary<String, AnyObject>
|
||||
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.dismissPopoverAnimated(true)
|
||||
porpOver.dismiss(animated: true)
|
||||
porpOver.delegate?.popoverControllerDidDismissPopover!(porpOver)
|
||||
}
|
||||
else if parentViewController is UINavigationController {
|
||||
navigationController?.popViewControllerAnimated(true)
|
||||
else if parent is UINavigationController {
|
||||
navigationController?.popViewController(animated: true)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
|
||||
class ExamplesFormViewController : XLFormViewController {
|
||||
|
||||
private struct Tags {
|
||||
fileprivate struct Tags {
|
||||
static let RealExample = "RealExamples"
|
||||
static let TextFieldAndTextView = "TextFieldAndTextView"
|
||||
static let Selectors = "Selectors"
|
||||
@@ -46,7 +46,7 @@ class ExamplesFormViewController : XLFormViewController {
|
||||
static let AccessoryView = "Accessory View"
|
||||
}
|
||||
|
||||
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
|
||||
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
|
||||
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
|
||||
initializeForm()
|
||||
}
|
||||
@@ -66,7 +66,7 @@ class ExamplesFormViewController : XLFormViewController {
|
||||
|
||||
form = XLFormDescriptor()
|
||||
|
||||
section = XLFormSectionDescriptor.formSectionWithTitle("Real examples")
|
||||
section = XLFormSectionDescriptor.formSection(withTitle: "Real examples")
|
||||
form.addFormSection(section)
|
||||
|
||||
// NativeEventFormViewController
|
||||
@@ -74,7 +74,7 @@ class ExamplesFormViewController : XLFormViewController {
|
||||
row.action.formSegueIdentifier = "NativeEventNavigationViewControllerSegue"
|
||||
section.addFormRow(row)
|
||||
|
||||
section = XLFormSectionDescriptor.formSectionWithTitle("This form is actually an example")
|
||||
section = XLFormSectionDescriptor.formSection(withTitle: "This form is actually an example")
|
||||
section.footerTitle = "ExamplesFormViewController.swift, Select an option to view another example"
|
||||
form.addFormSection(section)
|
||||
|
||||
@@ -102,7 +102,7 @@ class ExamplesFormViewController : XLFormViewController {
|
||||
section.addFormRow(row)
|
||||
|
||||
|
||||
section = XLFormSectionDescriptor.formSectionWithTitle("Multivalued example")
|
||||
section = XLFormSectionDescriptor.formSection(withTitle: "Multivalued example")
|
||||
form.addFormSection(section)
|
||||
|
||||
|
||||
@@ -123,14 +123,14 @@ class ExamplesFormViewController : XLFormViewController {
|
||||
section.addFormRow(row)
|
||||
|
||||
|
||||
section = XLFormSectionDescriptor.formSectionWithTitle("UI Customization")
|
||||
section = XLFormSectionDescriptor.formSection(withTitle: "UI Customization")
|
||||
form.addFormSection(section)
|
||||
|
||||
row = XLFormRowDescriptor(tag: Tags.UICusomization, rowType: XLFormRowDescriptorTypeButton, title:"UI Customization")
|
||||
row.action.viewControllerClass = UICustomizationFormViewController.self
|
||||
section.addFormRow(row)
|
||||
|
||||
section = XLFormSectionDescriptor.formSectionWithTitle("Custom Rows")
|
||||
section = XLFormSectionDescriptor.formSection(withTitle: "Custom Rows")
|
||||
form.addFormSection(section)
|
||||
|
||||
|
||||
@@ -138,7 +138,7 @@ class ExamplesFormViewController : XLFormViewController {
|
||||
row.action.viewControllerClass = CustomRowsViewController.self
|
||||
section.addFormRow(row)
|
||||
|
||||
section = XLFormSectionDescriptor.formSectionWithTitle("Accessory View")
|
||||
section = XLFormSectionDescriptor.formSection(withTitle: "Accessory View")
|
||||
form.addFormSection(section)
|
||||
|
||||
row = XLFormRowDescriptor(tag: Tags.AccessoryView, rowType: XLFormRowDescriptorTypeButton, title:"Accessory Views")
|
||||
@@ -146,7 +146,7 @@ class ExamplesFormViewController : XLFormViewController {
|
||||
section.addFormRow(row)
|
||||
|
||||
|
||||
section = XLFormSectionDescriptor.formSectionWithTitle("Validation Examples")
|
||||
section = XLFormSectionDescriptor.formSection(withTitle: "Validation Examples")
|
||||
form.addFormSection(section)
|
||||
|
||||
|
||||
@@ -154,7 +154,7 @@ class ExamplesFormViewController : XLFormViewController {
|
||||
row.action.formSegueIdentifier = "ValidationExamplesFormViewControllerSegue"
|
||||
section.addFormRow(row)
|
||||
|
||||
section = XLFormSectionDescriptor.formSectionWithTitle("Using Predicates")
|
||||
section = XLFormSectionDescriptor.formSection(withTitle: "Using Predicates")
|
||||
form.addFormSection(section)
|
||||
|
||||
|
||||
|
||||
@@ -66,6 +66,11 @@
|
||||
"idiom" : "ipad",
|
||||
"filename" : "xl_appicon_152.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"idiom" : "ipad",
|
||||
"size" : "83.5x83.5",
|
||||
"scale" : "2x"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
|
||||
class InputsFormViewController : XLFormViewController {
|
||||
|
||||
private struct Tags {
|
||||
fileprivate struct Tags {
|
||||
static let Name = "name"
|
||||
static let Email = "email"
|
||||
static let Twitter = "twitter"
|
||||
@@ -41,7 +41,7 @@ class InputsFormViewController : XLFormViewController {
|
||||
static let Notes = "notes"
|
||||
}
|
||||
|
||||
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
|
||||
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
|
||||
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
|
||||
initializeForm()
|
||||
}
|
||||
@@ -60,25 +60,25 @@ class InputsFormViewController : XLFormViewController {
|
||||
form = XLFormDescriptor(title: "Text Fields")
|
||||
form.assignFirstResponderOnShow = true
|
||||
|
||||
section = XLFormSectionDescriptor.formSectionWithTitle("TextField Types")
|
||||
section = XLFormSectionDescriptor.formSection(withTitle: "TextField Types")
|
||||
section.footerTitle = "This is a long text that will appear on section footer"
|
||||
form.addFormSection(section)
|
||||
|
||||
|
||||
// Name
|
||||
row = XLFormRowDescriptor(tag: Tags.Name, rowType: XLFormRowDescriptorTypeText, title: "Name")
|
||||
row.required = true
|
||||
row.isRequired = true
|
||||
section.addFormRow(row)
|
||||
|
||||
// Email
|
||||
row = XLFormRowDescriptor(tag: Tags.Email, rowType: XLFormRowDescriptorTypeEmail, title: "Email")
|
||||
// validate the email
|
||||
row.addValidator(XLFormValidator.emailValidator())
|
||||
row.addValidator(XLFormValidator.email())
|
||||
section.addFormRow(row)
|
||||
|
||||
// Twitter
|
||||
row = XLFormRowDescriptor(tag: Tags.Name, rowType: XLFormRowDescriptorTypeTwitter, title: "Twitter")
|
||||
row.disabled = NSNumber(bool: true)
|
||||
row.disabled = NSNumber(value: true as Bool)
|
||||
row.value = "@no_editable"
|
||||
section.addFormRow(row)
|
||||
|
||||
@@ -121,7 +121,7 @@ class InputsFormViewController : XLFormViewController {
|
||||
section.addFormRow(row)
|
||||
|
||||
|
||||
section = XLFormSectionDescriptor.formSectionWithTitle("TextView With Label Example")
|
||||
section = XLFormSectionDescriptor.formSection(withTitle: "TextView With Label Example")
|
||||
form.addFormSection(section)
|
||||
|
||||
row = XLFormRowDescriptor(tag: Tags.Number, rowType: XLFormRowDescriptorTypeTextView, title: "Notes")
|
||||
@@ -134,10 +134,10 @@ class InputsFormViewController : XLFormViewController {
|
||||
override func viewDidLoad()
|
||||
{
|
||||
super.viewDidLoad()
|
||||
navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .Save, target: self, action: "savePressed:")
|
||||
navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .save, target: self, action: #selector(InputsFormViewController.savePressed(_:)))
|
||||
}
|
||||
|
||||
func savePressed(button: UIBarButtonItem)
|
||||
func savePressed(_ button: UIBarButtonItem)
|
||||
{
|
||||
let validationErrors : Array<NSError> = self.formValidationErrors() as! Array<NSError>
|
||||
if (validationErrors.count > 0){
|
||||
|
||||
+36
-34
@@ -31,7 +31,7 @@ class MultivaluedFormViewController : XLFormViewController {
|
||||
initializeForm()
|
||||
}
|
||||
|
||||
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
|
||||
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
|
||||
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
|
||||
initializeForm()
|
||||
}
|
||||
@@ -45,7 +45,7 @@ class MultivaluedFormViewController : XLFormViewController {
|
||||
form = XLFormDescriptor(title: "Multivalued Examples")
|
||||
|
||||
// Multivalued section
|
||||
section = XLFormSectionDescriptor.formSectionWithTitle("Multivalued TextField", sectionOptions:XLFormSectionOptions.CanReorder.union(.CanInsert).union(.CanDelete), sectionInsertMode:.Button)
|
||||
section = XLFormSectionDescriptor.formSection(withTitle: "Multivalued TextField", sectionOptions:XLFormSectionOptions.canReorder.union(.canInsert).union(.canDelete), sectionInsertMode:.button)
|
||||
section.multivaluedAddButton!.title = "Add New Tag"
|
||||
section.footerTitle = "XLFormSectionInsertModeButton sectionType adds a 'Add Item' (Add New Tag) button row as last cell."
|
||||
// set up the row template
|
||||
@@ -56,7 +56,7 @@ class MultivaluedFormViewController : XLFormViewController {
|
||||
form.addFormSection(section)
|
||||
|
||||
// Another Multivalued section
|
||||
section = XLFormSectionDescriptor.formSectionWithTitle("Multivalued ActionSheet Selector example", sectionOptions:XLFormSectionOptions.CanInsert.union(.CanDelete))
|
||||
section = XLFormSectionDescriptor.formSection(withTitle: "Multivalued ActionSheet Selector example", sectionOptions:XLFormSectionOptions.canInsert.union(.canDelete))
|
||||
section.footerTitle = "XLFormSectionInsertModeLastRow sectionType adds a '+' icon inside last table view cell allowing us to add a new row."
|
||||
form.addFormSection(section)
|
||||
row = XLFormRowDescriptor(tag: nil, rowType: XLFormRowDescriptorTypeSelectorActionSheet, title: "Tap to select..")
|
||||
@@ -65,7 +65,7 @@ class MultivaluedFormViewController : XLFormViewController {
|
||||
|
||||
|
||||
// Another one
|
||||
section = XLFormSectionDescriptor.formSectionWithTitle("Multivalued Push Selector example", sectionOptions: XLFormSectionOptions.CanInsert.union(.CanDelete).union(.CanReorder), sectionInsertMode: .Button)
|
||||
section = XLFormSectionDescriptor.formSection(withTitle: "Multivalued Push Selector example", sectionOptions: XLFormSectionOptions.canInsert.union(.canDelete).union(.canReorder), sectionInsertMode: .button)
|
||||
section.footerTitle = "MultivaluedFormViewController.swift"
|
||||
form.addFormSection(section)
|
||||
row = XLFormRowDescriptor(tag: nil, rowType: XLFormRowDescriptorTypeSelectorPush, title: "Tap to select )..")
|
||||
@@ -78,30 +78,30 @@ class MultivaluedFormViewController : XLFormViewController {
|
||||
|
||||
override func viewDidLoad() {
|
||||
super.viewDidLoad()
|
||||
navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .Edit, target: self, action: "addDidTouch:")
|
||||
navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .edit, target: self, action: #selector(MultivaluedFormViewController.addDidTouch(_:)))
|
||||
}
|
||||
|
||||
//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!.disabled ? "Enable Form" : "Disable Form")
|
||||
actionSheet.showInView(view)
|
||||
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, clickedButtonAtIndex buttonIndex: Int) {
|
||||
override func actionSheet(_ actionSheet: UIActionSheet, clickedButtonAt buttonIndex: Int) {
|
||||
if actionSheet.destructiveButtonIndex == buttonIndex {
|
||||
if form.formSections.count > 0 {
|
||||
// remove last section
|
||||
form.removeFormSectionAtIndex(UInt(form.formSections.count - 1))
|
||||
form.removeFormSection(at: UInt(form.formSections.count - 1))
|
||||
}
|
||||
}
|
||||
else if actionSheet.buttonTitleAtIndex(buttonIndex) == "Add a section at the end" {
|
||||
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 newSection = XLFormSectionDescriptor.formSectionWithTitle("Section created at \(NSDateFormatter.localizedStringFromDate(NSDate(), dateStyle: NSDateFormatterStyle.ShortStyle, timeStyle: NSDateFormatterStyle.ShortStyle))", sectionOptions:XLFormSectionOptions.CanInsert.union(.CanDelete))
|
||||
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"]
|
||||
@@ -109,7 +109,7 @@ class MultivaluedFormViewController : XLFormViewController {
|
||||
form.addFormSection(newSection)
|
||||
}
|
||||
else {
|
||||
form.disabled = !self.form.disabled
|
||||
form.isDisabled = !self.form.isDisabled
|
||||
tableView.endEditing(true)
|
||||
tableView.reloadData()
|
||||
}
|
||||
@@ -126,7 +126,7 @@ class MultivaluedOnlyReorderViewController : XLFormViewController {
|
||||
self.initializeForm()
|
||||
}
|
||||
|
||||
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
|
||||
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
|
||||
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
|
||||
self.initializeForm()
|
||||
}
|
||||
@@ -143,29 +143,31 @@ class MultivaluedOnlyReorderViewController : XLFormViewController {
|
||||
form = XLFormDescriptor(title: "Only Reorder Examples")
|
||||
|
||||
// Multivalued Section with inline rows - section set up to support only reordering
|
||||
section = XLFormSectionDescriptor.formSectionWithTitle("Reordering Inline Rows",
|
||||
sectionOptions:.CanReorder)
|
||||
section = XLFormSectionDescriptor.formSection(withTitle: "Reordering Inline Rows",
|
||||
sectionOptions:.canReorder)
|
||||
section.footerTitle = "XLFormRowDescriptorTypeDateInline row type"
|
||||
form.addFormSection(section)
|
||||
var idx = 0
|
||||
for listItem in list {
|
||||
let timeIntervalSinceNow = NSTimeInterval(secondsPerDay * ++idx)
|
||||
idx += 1
|
||||
let timeIntervalSinceNow = TimeInterval(secondsPerDay * idx)
|
||||
row = XLFormRowDescriptor(tag: nil, rowType:XLFormRowDescriptorTypeDateInline, title: listItem)
|
||||
row.value = NSDate(timeIntervalSinceNow:timeIntervalSinceNow)
|
||||
row.value = Date(timeIntervalSinceNow:timeIntervalSinceNow)
|
||||
section.addFormRow(row)
|
||||
}
|
||||
|
||||
// Multivalued Section with common rows - section set up to support only reordering
|
||||
section = XLFormSectionDescriptor.formSectionWithTitle("Reordering Rows", sectionOptions:.CanReorder)
|
||||
section = XLFormSectionDescriptor.formSection(withTitle: "Reordering Rows", sectionOptions:.canReorder)
|
||||
section.footerTitle = "XLFormRowDescriptorTypeInfo row type"
|
||||
form.addFormSection(section)
|
||||
|
||||
|
||||
idx = 0
|
||||
for listItem in list {
|
||||
let timeIntervalSinceNow = NSTimeInterval(secondsPerDay * ++idx)
|
||||
idx += 1
|
||||
let timeIntervalSinceNow = TimeInterval(secondsPerDay * idx)
|
||||
row = XLFormRowDescriptor(tag: nil, rowType:XLFormRowDescriptorTypeInfo, title: listItem)
|
||||
row.value = NSDateFormatter.localizedStringFromDate(NSDate(timeIntervalSinceNow:timeIntervalSinceNow), dateStyle: .MediumStyle, timeStyle: .NoStyle)
|
||||
row.value = DateFormatter.localizedString(from: Date(timeIntervalSinceNow:timeIntervalSinceNow), dateStyle: .medium, timeStyle: .none)
|
||||
section.addFormRow(row)
|
||||
}
|
||||
|
||||
@@ -182,7 +184,7 @@ class MultivaluedOnlyInserViewController : XLFormViewController {
|
||||
}
|
||||
|
||||
|
||||
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
|
||||
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
|
||||
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
|
||||
self.initializeForm()
|
||||
}
|
||||
@@ -197,7 +199,7 @@ class MultivaluedOnlyInserViewController : XLFormViewController {
|
||||
|
||||
form = XLFormDescriptor(title: "Multivalued Only Insert")
|
||||
|
||||
section = XLFormSectionDescriptor.formSectionWithTitle("XLFormSectionInsertModeButton", sectionOptions:.CanInsert, sectionInsertMode:.Button)
|
||||
section = XLFormSectionDescriptor.formSection(withTitle: "XLFormSectionInsertModeButton", sectionOptions:.canInsert, sectionInsertMode:.button)
|
||||
form.addFormSection(section)
|
||||
|
||||
|
||||
@@ -205,15 +207,15 @@ class MultivaluedOnlyInserViewController : XLFormViewController {
|
||||
row.cellConfig["textField.placeholder"] = "Add a new tag"
|
||||
section.multivaluedRowTemplate = row
|
||||
|
||||
section = XLFormSectionDescriptor.formSectionWithTitle("XLFormSectionInsertModeButton With Inline Cells", sectionOptions:.CanInsert, sectionInsertMode:.Button)
|
||||
section = XLFormSectionDescriptor.formSection(withTitle: "XLFormSectionInsertModeButton With Inline Cells", sectionOptions:.canInsert, sectionInsertMode:.button)
|
||||
row = XLFormRowDescriptor(tag: nil, rowType:XLFormRowDescriptorTypeDateInline)
|
||||
row.value = NSDate()
|
||||
row.value = Date()
|
||||
row.title = "Date"
|
||||
section.multivaluedRowTemplate = row
|
||||
form.addFormSection(section)
|
||||
|
||||
section = XLFormSectionDescriptor.formSectionWithTitle("XLFormSectionInsertModeLastRow",
|
||||
sectionOptions:.CanInsert, sectionInsertMode:.LastRow)
|
||||
section = XLFormSectionDescriptor.formSection(withTitle: "XLFormSectionInsertModeLastRow",
|
||||
sectionOptions:.canInsert, sectionInsertMode:.lastRow)
|
||||
form.addFormSection(section)
|
||||
for tag in nameList {
|
||||
// add a row to the section, the row will be used to crete new rows.
|
||||
@@ -233,19 +235,19 @@ class MultivaluedOnlyDeleteViewController : XLFormViewController {
|
||||
initializeForm()
|
||||
}
|
||||
|
||||
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
|
||||
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
|
||||
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
|
||||
initializeForm()
|
||||
}
|
||||
|
||||
override func viewDidLoad() {
|
||||
super.viewDidLoad()
|
||||
navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Editing", style: .Plain, target: self, action: "toggleEditing:")
|
||||
navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Editing", style: .plain, target: self, action: #selector(MultivaluedOnlyDeleteViewController.toggleEditing(_:)))
|
||||
}
|
||||
|
||||
func toggleEditing(sender : UIBarButtonItem) {
|
||||
tableView.setEditing(!tableView.editing, animated: true)
|
||||
sender.title = tableView.editing ? "Editing" : "Not Editing"
|
||||
func toggleEditing(_ sender : UIBarButtonItem) {
|
||||
tableView.setEditing(!tableView.isEditing, animated: true)
|
||||
sender.title = tableView.isEditing ? "Editing" : "Not Editing"
|
||||
}
|
||||
|
||||
func initializeForm() {
|
||||
@@ -258,7 +260,7 @@ class MultivaluedOnlyDeleteViewController : XLFormViewController {
|
||||
|
||||
form = XLFormDescriptor(title: "Multivalued Only Delete")
|
||||
|
||||
section = XLFormSectionDescriptor.formSectionWithTitle("", sectionOptions:.CanDelete)
|
||||
section = XLFormSectionDescriptor.formSection(withTitle: "", sectionOptions:.canDelete)
|
||||
section.footerTitle = "you can swipe to delete when table.editing = NO (Not Editing)"
|
||||
form.addFormSection(section)
|
||||
|
||||
@@ -271,7 +273,7 @@ class MultivaluedOnlyDeleteViewController : XLFormViewController {
|
||||
}
|
||||
|
||||
// Multivalued Section with inline row.
|
||||
section = XLFormSectionDescriptor.formSectionWithTitle("", sectionOptions:.CanDelete)
|
||||
section = XLFormSectionDescriptor.formSection(withTitle: "", sectionOptions:.canDelete)
|
||||
section.footerTitle = "you can swipe to delete when table.editing = NO (Not Editing)"
|
||||
form.addFormSection(section)
|
||||
|
||||
|
||||
@@ -50,10 +50,10 @@ class XLFormCustomCell : XLFormBaseCell {
|
||||
}
|
||||
}
|
||||
|
||||
override func formDescriptorCellDidSelectedWithFormController(controller: XLFormViewController!) {
|
||||
override func formDescriptorCellDidSelected(withForm controller: XLFormViewController!) {
|
||||
// custom code here
|
||||
// i.e new behaviour when cell has been selected
|
||||
if let string = rowDescriptor?.value as? String where string == "Am a custom cell, select me!" {
|
||||
if let string = rowDescriptor?.value as? String , string == "Am a custom cell, select me!" {
|
||||
self.rowDescriptor?.value = string
|
||||
}
|
||||
else {
|
||||
@@ -61,7 +61,7 @@ class XLFormCustomCell : XLFormBaseCell {
|
||||
}
|
||||
|
||||
update()
|
||||
controller.tableView.selectRowAtIndexPath(nil, animated: true, scrollPosition: .None)
|
||||
controller.tableView.selectRow(at: nil, animated: true, scrollPosition: .none)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -27,7 +27,7 @@ import MapKit
|
||||
|
||||
class OthersFormViewController : XLFormViewController {
|
||||
|
||||
private struct Tags {
|
||||
fileprivate struct Tags {
|
||||
static let SwitchBool = "switchBool"
|
||||
static let SwitchCheck = "switchCheck"
|
||||
static let StepCounter = "stepCounter"
|
||||
@@ -46,12 +46,10 @@ class OthersFormViewController : XLFormViewController {
|
||||
|
||||
required init?(coder aDecoder: NSCoder) {
|
||||
super.init(coder: aDecoder)
|
||||
self.initializeForm()
|
||||
}
|
||||
|
||||
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
|
||||
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
|
||||
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
|
||||
self.initializeForm()
|
||||
}
|
||||
|
||||
|
||||
@@ -63,7 +61,7 @@ class OthersFormViewController : XLFormViewController {
|
||||
|
||||
form = XLFormDescriptor(title: "Other Cells")
|
||||
|
||||
section = XLFormSectionDescriptor.formSectionWithTitle("Other Cells")
|
||||
section = XLFormSectionDescriptor.formSection(withTitle: "Other Cells")
|
||||
section.footerTitle = "OthersFormViewController.swift"
|
||||
form.addFormSection(section)
|
||||
|
||||
@@ -81,6 +79,12 @@ class OthersFormViewController : XLFormViewController {
|
||||
row.selectorOptions = ["Apple", "Orange", "Pear"]
|
||||
row.value = "Pear"
|
||||
section.addFormRow(row)
|
||||
|
||||
row = XLFormRowDescriptor(tag: Tags.SegmentedControl, rowType: XLFormRowDescriptorTypeSegmentedInline, title: "Fruits Inline")
|
||||
row.selectorOptions = ["Apple", "Orange", "Pear"]
|
||||
row.value = "Pear"
|
||||
section.addFormRow(row)
|
||||
|
||||
|
||||
|
||||
// Slider
|
||||
@@ -99,29 +103,29 @@ class OthersFormViewController : XLFormViewController {
|
||||
// Info cell
|
||||
row = XLFormRowDescriptor(tag: Tags.Info, rowType: XLFormRowDescriptorTypeInfo)
|
||||
row.title = "Version"
|
||||
row.value = NSBundle.mainBundle().infoDictionary!["CFBundleShortVersionString"]
|
||||
row.value = Bundle.main.infoDictionary!["CFBundleShortVersionString"]
|
||||
section.addFormRow(row)
|
||||
|
||||
|
||||
section = XLFormSectionDescriptor.formSectionWithTitle("Buttons")
|
||||
section = XLFormSectionDescriptor.formSection(withTitle: "Buttons")
|
||||
section.footerTitle = "Blue buttons will show a message when Switch is ON"
|
||||
form.addFormSection(section)
|
||||
|
||||
// Button
|
||||
row = XLFormRowDescriptor(tag: Tags.Button, rowType: XLFormRowDescriptorTypeButton, title: "Button")
|
||||
row.cellConfig["textLabel.textColor"] = UIColor(red: 0.0, green: 122.0/255.0, blue: 1.0, alpha: 1.0)
|
||||
row.action.formSelector = "didTouchButton:"
|
||||
row.action.formSelector = #selector(OthersFormViewController.didTouchButton(_:))
|
||||
section.addFormRow(row)
|
||||
|
||||
|
||||
// Left Button
|
||||
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["textLabel.textAlignment"] = NSTextAlignment.left.rawValue
|
||||
row.cellConfig["accessoryType"] = UITableViewCellAccessoryType.disclosureIndicator.rawValue
|
||||
row.action.formBlock = { [weak self] (sender: XLFormRowDescriptor!) -> Void in
|
||||
let switchRow = sender.sectionDescriptor.formDescriptor!.formRowWithTag(Tags.SwitchBool)!
|
||||
if let value = switchRow.value where value.boolValue == true {
|
||||
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()
|
||||
}
|
||||
@@ -160,9 +164,8 @@ class OthersFormViewController : XLFormViewController {
|
||||
self.form = form
|
||||
}
|
||||
|
||||
|
||||
func didTouchButton(sender: XLFormRowDescriptor) {
|
||||
if sender.sectionDescriptor.formDescriptor.formRowWithTag(Tags.SwitchBool)?.value?.boolValue == true{
|
||||
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()
|
||||
}
|
||||
@@ -171,15 +174,18 @@ class OthersFormViewController : XLFormViewController {
|
||||
|
||||
override func viewDidLoad() {
|
||||
super.viewDidLoad()
|
||||
let barButton = UIBarButtonItem(title: "Disable", style: .Plain, target: self, action: "disableEnable:")
|
||||
|
||||
initializeForm()
|
||||
|
||||
let barButton = UIBarButtonItem(title: "Disable", style: .plain, target: self, action: #selector(OthersFormViewController.disableEnable(_:)))
|
||||
barButton.possibleTitles = Set(["Disable", "Enable"])
|
||||
navigationItem.rightBarButtonItem = barButton
|
||||
}
|
||||
|
||||
|
||||
func disableEnable(button : UIBarButtonItem) {
|
||||
form.disabled = !form.disabled
|
||||
button.title = form.disabled ? "Enable" : "Disable"
|
||||
func disableEnable(_ button : UIBarButtonItem) {
|
||||
form.isDisabled = !form.isDisabled
|
||||
button.title = form.isDisabled ? "Enable" : "Disable"
|
||||
tableView.endEditing(true)
|
||||
tableView.reloadData()
|
||||
}
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
|
||||
class BasicPredicateViewController : XLFormViewController {
|
||||
|
||||
private struct Tags {
|
||||
fileprivate struct Tags {
|
||||
|
||||
static let HideRow = "tag1"
|
||||
static let HideSection = "tag2"
|
||||
@@ -35,7 +35,7 @@ class BasicPredicateViewController : XLFormViewController {
|
||||
|
||||
}
|
||||
|
||||
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
|
||||
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
|
||||
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
|
||||
initializeForm()
|
||||
}
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
|
||||
class BlogExampleViewController : XLFormViewController {
|
||||
|
||||
private struct Tags {
|
||||
fileprivate struct Tags {
|
||||
static let Hobbies = "hobbies"
|
||||
static let Sport = "sport"
|
||||
static let Film = "films1"
|
||||
@@ -33,7 +33,7 @@ class BlogExampleViewController : XLFormViewController {
|
||||
static let Music = "music"
|
||||
}
|
||||
|
||||
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
|
||||
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
|
||||
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
|
||||
initializeForm()
|
||||
}
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
|
||||
class PredicateFormViewController : XLFormViewController {
|
||||
|
||||
private struct Tags {
|
||||
fileprivate struct Tags {
|
||||
static let Text = "text"
|
||||
static let Integer = "integer"
|
||||
static let Switch = "switch"
|
||||
@@ -34,7 +34,7 @@ class PredicateFormViewController : XLFormViewController {
|
||||
static let Account = "account"
|
||||
}
|
||||
|
||||
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
|
||||
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
|
||||
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
|
||||
initializeForm()
|
||||
}
|
||||
@@ -77,7 +77,7 @@ class PredicateFormViewController : XLFormViewController {
|
||||
|
||||
// Predicate Disabling
|
||||
row = XLFormRowDescriptor(tag: Tags.Date, rowType: XLFormRowDescriptorTypeDateInline, title:"Disabled")
|
||||
row.value = NSDate()
|
||||
row.value = Date()
|
||||
section.addFormRow(row)
|
||||
row.disabled = NSPredicate(format: "$\(Tags.Text).value contains[c] 'disable' OR ($\(Tags.Integer).value between {18, 60}) OR ($\(Tags.Switch).value == 0)")
|
||||
section.hidden = NSPredicate(format: "($\(Tags.Text).value contains[c] 'disable') AND ($\(Tags.Integer).value between {18, 60}) AND ($\(Tags.Switch).value == 0)")
|
||||
@@ -99,9 +99,9 @@ class PredicateFormViewController : XLFormViewController {
|
||||
row.onChangeBlock = { [weak self] oldValue, newValue, _ in
|
||||
let noValue = "No Value"
|
||||
let message = "Old value: \(oldValue ?? noValue), New value: \(newValue ?? noValue)"
|
||||
let alertView = UIAlertController(title: "Account Field changed", message: message, preferredStyle: .ActionSheet)
|
||||
alertView.addAction(UIAlertAction(title: "Cancel", style: .Cancel, handler: nil))
|
||||
self?.navigationController?.presentViewController(alertView, animated: true, completion: nil)
|
||||
let alertView = UIAlertController(title: "Account Field changed", message: message, preferredStyle: .actionSheet)
|
||||
alertView.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil))
|
||||
self?.navigationController?.present(alertView, animated: true, completion: nil)
|
||||
}
|
||||
|
||||
self.form = form
|
||||
|
||||
@@ -31,7 +31,7 @@ class NativeEventFormViewController : XLFormViewController {
|
||||
initializeForm()
|
||||
}
|
||||
|
||||
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
|
||||
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
|
||||
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
|
||||
initializeForm()
|
||||
}
|
||||
@@ -50,7 +50,7 @@ class NativeEventFormViewController : XLFormViewController {
|
||||
// Title
|
||||
row = XLFormRowDescriptor(tag: "title", rowType: XLFormRowDescriptorTypeText)
|
||||
row.cellConfigAtConfigure["textField.placeholder"] = "Title"
|
||||
row.required = true
|
||||
row.isRequired = true
|
||||
section.addFormRow(row)
|
||||
|
||||
// Location
|
||||
@@ -67,12 +67,12 @@ class NativeEventFormViewController : XLFormViewController {
|
||||
|
||||
// Starts
|
||||
row = XLFormRowDescriptor(tag: "starts", rowType: XLFormRowDescriptorTypeDateTimeInline, title: "Starts")
|
||||
row.value = NSDate(timeIntervalSinceNow: 60*60*24)
|
||||
row.value = Date(timeIntervalSinceNow: 60*60*24)
|
||||
section.addFormRow(row)
|
||||
|
||||
// Ends
|
||||
row = XLFormRowDescriptor(tag: "ends", rowType: XLFormRowDescriptorTypeDateTimeInline, title: "Ends")
|
||||
row.value = NSDate(timeIntervalSinceNow: 60*60*25)
|
||||
row.value = Date(timeIntervalSinceNow: 60*60*25)
|
||||
section.addFormRow(row)
|
||||
|
||||
section = XLFormSectionDescriptor.formSection()
|
||||
@@ -139,83 +139,83 @@ class NativeEventFormViewController : XLFormViewController {
|
||||
|
||||
override func viewDidLoad(){
|
||||
super.viewDidLoad()
|
||||
navigationItem.leftBarButtonItem = UIBarButtonItem(barButtonSystemItem: .Cancel, target: self, action: "cancelPressed:")
|
||||
navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .Save, target: self, action: "savePressed:")
|
||||
navigationItem.leftBarButtonItem = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(NativeEventFormViewController.cancelPressed(_:)))
|
||||
navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .save, target: self, action: #selector(NativeEventFormViewController.savePressed(_:)))
|
||||
}
|
||||
|
||||
// MARK: XLFormDescriptorDelegate
|
||||
|
||||
override func formRowDescriptorValueHasChanged(formRow: XLFormRowDescriptor!, oldValue: AnyObject!, newValue: AnyObject!) {
|
||||
override func formRowDescriptorValueHasChanged(_ formRow: XLFormRowDescriptor!, oldValue: Any!, newValue: Any!) {
|
||||
super.formRowDescriptorValueHasChanged(formRow, oldValue: oldValue, newValue: newValue)
|
||||
if formRow.tag == "alert" {
|
||||
if !formRow.value!.valueData().isEqual(0) && oldValue.valueData().isEqual(0) {
|
||||
if !((formRow.value! as AnyObject).valueData() as AnyObject).isEqual(0) && ((oldValue as AnyObject).valueData() as AnyObject).isEqual(0) {
|
||||
|
||||
let newRow = formRow.copy() as! XLFormRowDescriptor
|
||||
newRow.tag = "secondAlert"
|
||||
newRow.title = "Second Alert"
|
||||
form.addFormRow(newRow, afterRow:formRow)
|
||||
}
|
||||
else if !oldValue.valueData().isEqual(0) && newValue.valueData().isEqual(0) {
|
||||
form.removeFormRowWithTag("secondAlert")
|
||||
else if !((oldValue as AnyObject).valueData() as AnyObject).isEqual(0) && ((newValue as AnyObject).valueData() as AnyObject).isEqual(0) {
|
||||
form.removeFormRow(withTag: "secondAlert")
|
||||
}
|
||||
}
|
||||
else if formRow.tag == "all-day" {
|
||||
let startDateDescriptor = form.formRowWithTag("starts")!
|
||||
let endDateDescriptor = form.formRowWithTag("ends")!
|
||||
let dateStartCell: XLFormDateCell = startDateDescriptor.cellForFormController(self) as! XLFormDateCell
|
||||
let dateEndCell: XLFormDateCell = endDateDescriptor.cellForFormController(self) as! XLFormDateCell
|
||||
if formRow.value!.valueData() as? Bool == true {
|
||||
let startDateDescriptor = form.formRow(withTag: "starts")!
|
||||
let endDateDescriptor = form.formRow(withTag: "ends")!
|
||||
let dateStartCell: XLFormDateCell = startDateDescriptor.cell(forForm: self) as! XLFormDateCell
|
||||
let dateEndCell: XLFormDateCell = endDateDescriptor.cell(forForm: self) as! XLFormDateCell
|
||||
if (formRow.value! as AnyObject).valueData() as? Bool == true {
|
||||
startDateDescriptor.valueTransformer = DateValueTrasformer.self
|
||||
endDateDescriptor.valueTransformer = DateValueTrasformer.self
|
||||
dateStartCell.formDatePickerMode = .Date
|
||||
dateEndCell.formDatePickerMode = .Date
|
||||
dateStartCell.formDatePickerMode = .date
|
||||
dateEndCell.formDatePickerMode = .date
|
||||
}
|
||||
else{
|
||||
startDateDescriptor.valueTransformer = DateTimeValueTrasformer.self
|
||||
endDateDescriptor.valueTransformer = DateTimeValueTrasformer.self
|
||||
dateStartCell.formDatePickerMode = .DateTime
|
||||
dateEndCell.formDatePickerMode = .DateTime
|
||||
dateStartCell.formDatePickerMode = .dateTime
|
||||
dateEndCell.formDatePickerMode = .dateTime
|
||||
}
|
||||
updateFormRow(startDateDescriptor)
|
||||
updateFormRow(endDateDescriptor)
|
||||
}
|
||||
else if formRow.tag == "starts" {
|
||||
let startDateDescriptor = form.formRowWithTag("starts")!
|
||||
let endDateDescriptor = form.formRowWithTag("ends")!
|
||||
if startDateDescriptor.value!.compare(endDateDescriptor.value as! NSDate) == .OrderedDescending {
|
||||
let startDateDescriptor = form.formRow(withTag: "starts")!
|
||||
let endDateDescriptor = form.formRow(withTag: "ends")!
|
||||
if (startDateDescriptor.value! as AnyObject).compare(endDateDescriptor.value as! Date) == .orderedDescending {
|
||||
// startDateDescriptor is later than endDateDescriptor
|
||||
endDateDescriptor.value = NSDate(timeInterval: 60*60*24, sinceDate: startDateDescriptor.value as! NSDate)
|
||||
endDateDescriptor.cellConfig.removeObjectForKey("detailTextLabel.attributedText")
|
||||
endDateDescriptor.value = Date(timeInterval: 60*60*24, since: startDateDescriptor.value as! Date)
|
||||
endDateDescriptor.cellConfig.removeObject(forKey: "detailTextLabel.attributedText")
|
||||
updateFormRow(endDateDescriptor)
|
||||
}
|
||||
}
|
||||
else if formRow.tag == "ends" {
|
||||
let startDateDescriptor = form.formRowWithTag("starts")!
|
||||
let endDateDescriptor = form.formRowWithTag("ends")!
|
||||
let dateEndCell = endDateDescriptor.cellForFormController(self) as! XLFormDateCell
|
||||
if startDateDescriptor.value!.compare(endDateDescriptor.value as! NSDate) == .OrderedDescending {
|
||||
let startDateDescriptor = form.formRow(withTag: "starts")!
|
||||
let endDateDescriptor = form.formRow(withTag: "ends")!
|
||||
let dateEndCell = endDateDescriptor.cell(forForm: self) as! XLFormDateCell
|
||||
if (startDateDescriptor.value! as AnyObject).compare(endDateDescriptor.value as! Date) == .orderedDescending {
|
||||
// startDateDescriptor is later than endDateDescriptor
|
||||
dateEndCell.update()
|
||||
let newDetailText = dateEndCell.detailTextLabel!.text!
|
||||
let strikeThroughAttribute = [NSStrikethroughStyleAttributeName : NSUnderlineStyle.StyleSingle.rawValue]
|
||||
let strikeThroughAttribute = [NSStrikethroughStyleAttributeName : NSUnderlineStyle.styleSingle.rawValue]
|
||||
let strikeThroughText = NSAttributedString(string: newDetailText, attributes: strikeThroughAttribute)
|
||||
endDateDescriptor.cellConfig["detailTextLabel.attributedText"] = strikeThroughText
|
||||
updateFormRow(endDateDescriptor)
|
||||
}
|
||||
else{
|
||||
let endDateDescriptor = self.form.formRowWithTag("ends")!
|
||||
endDateDescriptor.cellConfig.removeObjectForKey("detailTextLabel.attributedText")
|
||||
let endDateDescriptor = self.form.formRow(withTag: "ends")!
|
||||
endDateDescriptor.cellConfig.removeObject(forKey: "detailTextLabel.attributedText")
|
||||
updateFormRow(endDateDescriptor)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func cancelPressed(button: UIBarButtonItem){
|
||||
dismissViewControllerAnimated(true, completion: nil)
|
||||
func cancelPressed(_ button: UIBarButtonItem){
|
||||
dismiss(animated: true, completion: nil)
|
||||
}
|
||||
|
||||
|
||||
func savePressed(button: UIBarButtonItem){
|
||||
func savePressed(_ button: UIBarButtonItem){
|
||||
let validationErrors : Array<NSError> = formValidationErrors() as! Array<NSError>
|
||||
if (validationErrors.count > 0){
|
||||
showFormValidationError(validationErrors.first)
|
||||
@@ -230,7 +230,7 @@ class NativeEventNavigationViewController : UINavigationController {
|
||||
|
||||
override func viewDidLoad(){
|
||||
super.viewDidLoad()
|
||||
view.tintColor = .redColor()
|
||||
view.tintColor = .red
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -27,7 +27,7 @@ import MapKit
|
||||
|
||||
// Mark - NSValueTransformer
|
||||
|
||||
class NSArrayValueTrasformer : NSValueTransformer {
|
||||
class NSArrayValueTrasformer : ValueTransformer {
|
||||
|
||||
override class func transformedValueClass() -> AnyClass {
|
||||
return NSString.self
|
||||
@@ -37,7 +37,7 @@ class NSArrayValueTrasformer : NSValueTransformer {
|
||||
return false
|
||||
}
|
||||
|
||||
override func transformedValue(value: AnyObject?) -> AnyObject? {
|
||||
override func transformedValue(_ value: Any?) -> Any? {
|
||||
if let arrayValue = value as? Array<AnyObject> {
|
||||
return String(format: "%d Item%@", arrayValue.count, arrayValue.count > 1 ? "s" : "")
|
||||
}
|
||||
@@ -48,7 +48,7 @@ class NSArrayValueTrasformer : NSValueTransformer {
|
||||
}
|
||||
}
|
||||
|
||||
class ISOLanguageCodesValueTranformer : NSValueTransformer {
|
||||
class ISOLanguageCodesValueTranformer : ValueTransformer {
|
||||
|
||||
override class func transformedValueClass() -> AnyClass {
|
||||
return NSString.self
|
||||
@@ -59,9 +59,9 @@ class ISOLanguageCodesValueTranformer : NSValueTransformer {
|
||||
return false
|
||||
}
|
||||
|
||||
override func transformedValue(value: AnyObject?) -> AnyObject? {
|
||||
override func transformedValue(_ value: Any?) -> Any? {
|
||||
if let stringValue = value as? String {
|
||||
return NSLocale.currentLocale().displayNameForKey(NSLocaleLanguageCode, value: stringValue)
|
||||
return (Locale.current as NSLocale).displayName(forKey: NSLocale.Key.languageCode, value: stringValue)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
@@ -71,7 +71,7 @@ class ISOLanguageCodesValueTranformer : NSValueTransformer {
|
||||
|
||||
class SelectorsFormViewController : XLFormViewController {
|
||||
|
||||
private struct Tags {
|
||||
fileprivate struct Tags {
|
||||
static let Push = "selectorPush"
|
||||
static let Popover = "selectorPopover"
|
||||
static let ActionSheet = "selectorActionSheet"
|
||||
@@ -90,7 +90,7 @@ class SelectorsFormViewController : XLFormViewController {
|
||||
}
|
||||
|
||||
|
||||
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
|
||||
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
|
||||
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
|
||||
initializeForm()
|
||||
}
|
||||
@@ -102,15 +102,15 @@ class SelectorsFormViewController : XLFormViewController {
|
||||
|
||||
override func viewDidLoad() {
|
||||
super.viewDidLoad()
|
||||
let barButton = UIBarButtonItem(title: "Disable", style: .Plain, target: self, action: "disableEnable:")
|
||||
let barButton = UIBarButtonItem(title: "Disable", style: .plain, target: self, action: #selector(SelectorsFormViewController.disableEnable(_:)))
|
||||
barButton.possibleTitles = Set(["Disable", "Enable"])
|
||||
navigationItem.rightBarButtonItem = barButton
|
||||
}
|
||||
|
||||
func disableEnable(button : UIBarButtonItem)
|
||||
func disableEnable(_ button : UIBarButtonItem)
|
||||
{
|
||||
form.disabled = !form.disabled
|
||||
button.title = form.disabled ? "Enable" : "Disable"
|
||||
form.isDisabled = !form.isDisabled
|
||||
button.title = form.isDisabled ? "Enable" : "Disable"
|
||||
tableView.endEditing(true)
|
||||
tableView.reloadData()
|
||||
}
|
||||
@@ -122,7 +122,7 @@ class SelectorsFormViewController : XLFormViewController {
|
||||
var row : XLFormRowDescriptor
|
||||
|
||||
form = XLFormDescriptor(title: "Selectors")
|
||||
section = XLFormSectionDescriptor.formSectionWithTitle("Selectors")
|
||||
section = XLFormSectionDescriptor.formSection(withTitle: "Selectors")
|
||||
section.footerTitle = "SelectorsFormViewController.swift"
|
||||
form.addFormSection(section)
|
||||
|
||||
@@ -140,7 +140,7 @@ class SelectorsFormViewController : XLFormViewController {
|
||||
|
||||
|
||||
// Selector Popover
|
||||
if (UIDevice.currentDevice().userInterfaceIdiom == UIUserInterfaceIdiom.Pad){
|
||||
if (UIDevice.current.userInterfaceIdiom == UIUserInterfaceIdiom.pad){
|
||||
row = XLFormRowDescriptor(tag: Tags.Popover, rowType:XLFormRowDescriptorTypeSelectorPopover, title:"PopOver")
|
||||
row.selectorOptions = ["Option 1", "Option 2", "Option 3", "Option 4", "Option 5", "Option 6"]
|
||||
row.value = "Option 2"
|
||||
@@ -169,7 +169,7 @@ class SelectorsFormViewController : XLFormViewController {
|
||||
|
||||
|
||||
// --------- Fixed Controls
|
||||
section = XLFormSectionDescriptor.formSectionWithTitle("Fixed Controls")
|
||||
section = XLFormSectionDescriptor.formSection(withTitle: "Fixed Controls")
|
||||
form.addFormSection(section)
|
||||
|
||||
row = XLFormRowDescriptor(tag: Tags.Picker, rowType:XLFormRowDescriptorTypePicker)
|
||||
@@ -178,7 +178,7 @@ class SelectorsFormViewController : XLFormViewController {
|
||||
section.addFormRow(row)
|
||||
|
||||
// --------- Inline Selectors
|
||||
section = XLFormSectionDescriptor.formSectionWithTitle("Inline Selectors")
|
||||
section = XLFormSectionDescriptor.formSection(withTitle: "Inline Selectors")
|
||||
form.addFormSection(section)
|
||||
|
||||
row = XLFormRowDescriptor(tag: Tags.MultipleSelector, rowType:XLFormRowDescriptorTypeSelectorPickerViewInline, title:"Inline Picker View")
|
||||
@@ -187,7 +187,7 @@ class SelectorsFormViewController : XLFormViewController {
|
||||
section.addFormRow(row)
|
||||
|
||||
// --------- MultipleSelector
|
||||
section = XLFormSectionDescriptor.formSectionWithTitle("Multiple Selectors")
|
||||
section = XLFormSectionDescriptor.formSection(withTitle: "Multiple Selectors")
|
||||
form.addFormSection(section)
|
||||
|
||||
row = XLFormRowDescriptor(tag: Tags.MultipleSelector, rowType:XLFormRowDescriptorTypeMultipleSelector, title:"Multiple Selector")
|
||||
@@ -206,26 +206,26 @@ class SelectorsFormViewController : XLFormViewController {
|
||||
|
||||
// Language multiple selector
|
||||
row = XLFormRowDescriptor(tag: Tags.MultipleSelector, rowType:XLFormRowDescriptorTypeMultipleSelector, title:"Multiple Selector")
|
||||
row.selectorOptions = NSLocale.ISOLanguageCodes()
|
||||
row.selectorOptions = Locale.isoLanguageCodes
|
||||
row.selectorTitle = "Languages"
|
||||
row.valueTransformer = ISOLanguageCodesValueTranformer.self
|
||||
row.value = NSLocale.preferredLanguages()
|
||||
row.value = Locale.preferredLanguages
|
||||
section.addFormRow(row)
|
||||
|
||||
|
||||
if UIDevice.currentDevice().userInterfaceIdiom == .Pad {
|
||||
if UIDevice.current.userInterfaceIdiom == .pad {
|
||||
// Language multiple selector popover
|
||||
row = XLFormRowDescriptor(tag: Tags.MultipleSelectorPopover, rowType:XLFormRowDescriptorTypeMultipleSelectorPopover, title:"Multiple Selector PopOver")
|
||||
row.selectorOptions = NSLocale.ISOLanguageCodes()
|
||||
row.selectorOptions = Locale.isoLanguageCodes
|
||||
row.valueTransformer = ISOLanguageCodesValueTranformer.self
|
||||
row.value = NSLocale.preferredLanguages()
|
||||
row.value = Locale.preferredLanguages
|
||||
section.addFormRow(row)
|
||||
}
|
||||
|
||||
|
||||
|
||||
// --------- Dynamic Selectors
|
||||
section = XLFormSectionDescriptor.formSectionWithTitle("Dynamic Selectors")
|
||||
section = XLFormSectionDescriptor.formSection(withTitle: "Dynamic Selectors")
|
||||
form.addFormSection(section)
|
||||
|
||||
row = XLFormRowDescriptor(tag: Tags.DynamicSelectors, rowType:XLFormRowDescriptorTypeButton, title:"Dynamic Selectors")
|
||||
@@ -235,7 +235,7 @@ class SelectorsFormViewController : XLFormViewController {
|
||||
|
||||
|
||||
// --------- Custom Selectors
|
||||
section = XLFormSectionDescriptor.formSectionWithTitle("Custom Selectors")
|
||||
section = XLFormSectionDescriptor.formSection(withTitle: "Custom Selectors")
|
||||
form.addFormSection(section)
|
||||
|
||||
row = XLFormRowDescriptor(tag: Tags.CustomSelectors, rowType:XLFormRowDescriptorTypeButton, title:"Custom Selectors")
|
||||
@@ -244,7 +244,7 @@ class SelectorsFormViewController : XLFormViewController {
|
||||
|
||||
|
||||
// --------- Selector definition types
|
||||
section = XLFormSectionDescriptor.formSectionWithTitle("Selectors")
|
||||
section = XLFormSectionDescriptor.formSection(withTitle: "Selectors")
|
||||
form.addFormSection(section)
|
||||
|
||||
// selector with segue class
|
||||
@@ -280,7 +280,7 @@ class SelectorsFormViewController : XLFormViewController {
|
||||
}
|
||||
|
||||
|
||||
override func storyboardForRow(formRow: XLFormRowDescriptor!) -> UIStoryboard! {
|
||||
override func storyboard(forRow formRow: XLFormRowDescriptor!) -> UIStoryboard! {
|
||||
return UIStoryboard(name: "iPhoneStoryboard", bundle:nil)
|
||||
}
|
||||
|
||||
|
||||
+14
-14
@@ -25,13 +25,13 @@
|
||||
|
||||
class UICustomizationFormViewController : XLFormViewController {
|
||||
|
||||
private struct Tags {
|
||||
fileprivate struct Tags {
|
||||
static let Name = "Name"
|
||||
static let Button = "Button"
|
||||
}
|
||||
|
||||
|
||||
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
|
||||
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
|
||||
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
|
||||
self.initializeForm()
|
||||
}
|
||||
@@ -55,15 +55,15 @@ class UICustomizationFormViewController : XLFormViewController {
|
||||
// Name
|
||||
row = XLFormRowDescriptor(tag: Tags.Name, rowType: XLFormRowDescriptorTypeText, title:"Name")
|
||||
// change the background color
|
||||
row.cellConfigAtConfigure["backgroundColor"] = UIColor.greenColor()
|
||||
row.cellConfigAtConfigure["backgroundColor"] = UIColor.green
|
||||
// font
|
||||
row.cellConfig["textLabel.font"] = UIFont.systemFontOfSize(30)
|
||||
row.cellConfig["textLabel.font"] = UIFont.systemFont(ofSize: 30)
|
||||
// background color
|
||||
row.cellConfig["textField.backgroundColor"] = UIColor.grayColor()
|
||||
row.cellConfig["textField.backgroundColor"] = UIColor.gray
|
||||
// font
|
||||
row.cellConfig["textField.font"] = UIFont.systemFontOfSize(25)
|
||||
row.cellConfig["textField.font"] = UIFont.systemFont(ofSize: 25)
|
||||
// alignment
|
||||
row.cellConfig["textField.textAlignment"] = NSTextAlignment.Right.rawValue
|
||||
row.cellConfig["textField.textAlignment"] = NSTextAlignment.right.rawValue
|
||||
section.addFormRow(row)
|
||||
|
||||
|
||||
@@ -73,23 +73,23 @@ class UICustomizationFormViewController : XLFormViewController {
|
||||
|
||||
//Button
|
||||
row = XLFormRowDescriptor(tag: Tags.Button, rowType: XLFormRowDescriptorTypeButton, title:"Button")
|
||||
row.cellConfigAtConfigure["backgroundColor"] = UIColor.purpleColor()
|
||||
row.cellConfig["textLabel.color"] = UIColor.whiteColor()
|
||||
row.cellConfig["textLabel.font"] = UIFont.systemFontOfSize(40)
|
||||
row.cellConfigAtConfigure["backgroundColor"] = UIColor.purple
|
||||
row.cellConfig["textLabel.color"] = UIColor.white
|
||||
row.cellConfig["textLabel.font"] = UIFont.systemFont(ofSize: 40)
|
||||
section.addFormRow(row)
|
||||
|
||||
self.form = form
|
||||
}
|
||||
|
||||
override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
|
||||
override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
|
||||
// change cell height of a particular cell
|
||||
if form.formRowAtIndex(indexPath)?.tag == "Name" {
|
||||
if form.formRow(atIndex: indexPath)?.tag == "Name" {
|
||||
return 60.0
|
||||
}
|
||||
else if form.formRowAtIndex(indexPath)?.tag == "Button" {
|
||||
else if form.formRow(atIndex: indexPath)?.tag == "Button" {
|
||||
return 100.0
|
||||
}
|
||||
return super.tableView(tableView, heightForRowAtIndexPath: indexPath)
|
||||
return super.tableView(tableView, heightForRowAt: indexPath)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+23
-23
@@ -26,7 +26,7 @@
|
||||
|
||||
class ValidationExamplesFormViewController : XLFormViewController {
|
||||
|
||||
private struct Tags {
|
||||
fileprivate struct Tags {
|
||||
static let ValidationName = "Name"
|
||||
static let ValidationEmail = "Email"
|
||||
static let ValidationPassword = "Password"
|
||||
@@ -34,7 +34,7 @@ class ValidationExamplesFormViewController : XLFormViewController {
|
||||
}
|
||||
|
||||
|
||||
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
|
||||
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
|
||||
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
|
||||
initializeForm()
|
||||
}
|
||||
@@ -60,8 +60,8 @@ class ValidationExamplesFormViewController : XLFormViewController {
|
||||
// Name
|
||||
row = XLFormRowDescriptor(tag: Tags.ValidationName, rowType: XLFormRowDescriptorTypeText, title:"Name")
|
||||
row.cellConfigAtConfigure["textField.placeholder"] = "Required..."
|
||||
row.cellConfigAtConfigure["textField.textAlignment"] = NSTextAlignment.Right.rawValue
|
||||
row.required = true
|
||||
row.cellConfigAtConfigure["textField.textAlignment"] = NSTextAlignment.right.rawValue
|
||||
row.isRequired = true
|
||||
row.value = "Martin"
|
||||
section.addFormRow(row)
|
||||
|
||||
@@ -71,10 +71,10 @@ class ValidationExamplesFormViewController : XLFormViewController {
|
||||
|
||||
// Email
|
||||
row = XLFormRowDescriptor(tag: Tags.ValidationEmail, rowType: XLFormRowDescriptorTypeText, title:"Email")
|
||||
row.cellConfigAtConfigure["textField.textAlignment"] = NSTextAlignment.Right.rawValue
|
||||
row.required = false
|
||||
row.cellConfigAtConfigure["textField.textAlignment"] = NSTextAlignment.right.rawValue
|
||||
row.isRequired = false
|
||||
row.value = "not valid email"
|
||||
row.addValidator(XLFormValidator.emailValidator())
|
||||
row.addValidator(XLFormValidator.email())
|
||||
section.addFormRow(row)
|
||||
|
||||
|
||||
@@ -86,8 +86,8 @@ class ValidationExamplesFormViewController : XLFormViewController {
|
||||
// Password
|
||||
row = XLFormRowDescriptor(tag: Tags.ValidationPassword, rowType: XLFormRowDescriptorTypePassword, title:"Password")
|
||||
row.cellConfigAtConfigure["textField.placeholder"] = "Required..."
|
||||
row.cellConfigAtConfigure["textField.textAlignment"] = NSTextAlignment.Right.rawValue
|
||||
row.required = true
|
||||
row.cellConfigAtConfigure["textField.textAlignment"] = NSTextAlignment.right.rawValue
|
||||
row.isRequired = true
|
||||
row.addValidator(XLFormRegexValidator(msg: "At least 6, max 32 characters", andRegexString: "^(?=.*\\d)(?=.*[A-Za-z]).{6,32}$"))
|
||||
section.addFormRow(row)
|
||||
|
||||
@@ -100,8 +100,8 @@ class ValidationExamplesFormViewController : XLFormViewController {
|
||||
// Integer
|
||||
row = XLFormRowDescriptor(tag: Tags.ValidationInteger, rowType:XLFormRowDescriptorTypeInteger, title:"Integer")
|
||||
row.cellConfigAtConfigure["textField.placeholder"] = "Required..."
|
||||
row.cellConfigAtConfigure["textField.textAlignment"] = NSTextAlignment.Right.rawValue
|
||||
row.required = true
|
||||
row.cellConfigAtConfigure["textField.textAlignment"] = NSTextAlignment.right.rawValue
|
||||
row.isRequired = true
|
||||
row.addValidator(XLFormRegexValidator(msg: "greater than 50 and less than 100", andRegexString: "^([5-9][0-9]|100)$"))
|
||||
section.addFormRow(row)
|
||||
|
||||
@@ -111,30 +111,30 @@ class ValidationExamplesFormViewController : XLFormViewController {
|
||||
override func viewDidLoad() {
|
||||
super.viewDidLoad()
|
||||
navigationItem.rightBarButtonItem?.target = self
|
||||
navigationItem.rightBarButtonItem?.action = "validateForm:"
|
||||
navigationItem.rightBarButtonItem?.action = #selector(ValidationExamplesFormViewController.validateForm(_:))
|
||||
}
|
||||
|
||||
|
||||
|
||||
//MARK: Actions
|
||||
|
||||
func validateForm(buttonItem: UIBarButtonItem) {
|
||||
func validateForm(_ buttonItem: UIBarButtonItem) {
|
||||
let array = formValidationErrors()
|
||||
for errorItem in array {
|
||||
for errorItem in array! {
|
||||
let error = errorItem as! NSError
|
||||
let validationStatus : XLFormValidationStatus = error.userInfo[XLValidationStatusErrorKey] as! XLFormValidationStatus
|
||||
if validationStatus.rowDescriptor!.tag == Tags.ValidationName {
|
||||
if let rowDescriptor = validationStatus.rowDescriptor, let indexPath = form.indexPathOfFormRow(rowDescriptor), let cell = tableView.cellForRowAtIndexPath(indexPath) {
|
||||
cell.backgroundColor = .orangeColor()
|
||||
UIView.animateWithDuration(0.3, animations: { () -> Void in
|
||||
cell.backgroundColor = .whiteColor()
|
||||
if let rowDescriptor = validationStatus.rowDescriptor, let indexPath = form.indexPath(ofFormRow: rowDescriptor), let cell = tableView.cellForRow(at: indexPath) {
|
||||
cell.backgroundColor = .orange
|
||||
UIView.animate(withDuration: 0.3, animations: { () -> Void in
|
||||
cell.backgroundColor = .white
|
||||
})
|
||||
}
|
||||
}
|
||||
else if validationStatus.rowDescriptor!.tag == Tags.ValidationEmail ||
|
||||
validationStatus.rowDescriptor!.tag == Tags.ValidationPassword ||
|
||||
validationStatus.rowDescriptor!.tag == Tags.ValidationInteger {
|
||||
if let rowDescriptor = validationStatus.rowDescriptor, let indexPath = form.indexPathOfFormRow(rowDescriptor), let cell = tableView.cellForRowAtIndexPath(indexPath) {
|
||||
if let rowDescriptor = validationStatus.rowDescriptor, let indexPath = form.indexPath(ofFormRow: rowDescriptor), let cell = tableView.cellForRow(at: indexPath) {
|
||||
self.animateCell(cell)
|
||||
}
|
||||
}
|
||||
@@ -144,14 +144,14 @@ class ValidationExamplesFormViewController : XLFormViewController {
|
||||
|
||||
//MARK: - Helperph
|
||||
|
||||
func animateCell(cell: UITableViewCell) {
|
||||
func animateCell(_ cell: UITableViewCell) {
|
||||
let animation = CAKeyframeAnimation()
|
||||
animation.keyPath = "position.x"
|
||||
animation.values = [0, 20, -20, 10, 0]
|
||||
animation.keyTimes = [0, (1 / 6.0), (3 / 6.0), (5 / 6.0), 1]
|
||||
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.additive = true
|
||||
cell.layer.addAnimation(animation, forKey: "shake")
|
||||
animation.isAdditive = true
|
||||
cell.layer.add(animation, forKey: "shake")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,9 +4,9 @@ XLForm
|
||||
By [XMARTLABS](http://xmartlabs.com).
|
||||
|
||||
[](https://travis-ci.org/xmartlabs/XLForm)
|
||||
[](https://github.com/xmartlabs/XLForm/releases)
|
||||
<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 2 native implementation we have recently created [Eureka], a complete re-design of XLForm in Swift 2.** *Do not panic, We will continue maintaining and improving XLForm, obj-c rocks!!*
|
||||
**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!!*
|
||||
|
||||
Purpose
|
||||
--------------
|
||||
@@ -15,7 +15,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
|
||||
|
||||
|
||||

|
||||
@@ -38,8 +38,75 @@ What XLForm does
|
||||
|
||||
|
||||
|
||||
How to create a form
|
||||
-----------------------------
|
||||
## How to create a form
|
||||
|
||||
#### Create an instance of XLFormViewController
|
||||
|
||||
##### Swift
|
||||
|
||||
```swift
|
||||
class CalendarEventFormViewController : XLFormViewController {
|
||||
|
||||
required init(coder aDecoder: NSCoder) {
|
||||
super.init(coder: aDecoder)
|
||||
self.initializeForm()
|
||||
}
|
||||
|
||||
|
||||
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
|
||||
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
|
||||
self.initializeForm()
|
||||
}
|
||||
|
||||
func initializeForm() {
|
||||
// Implementation details covered in the next section.
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
##### Objective-C
|
||||
|
||||
```objc
|
||||
#import "XLFormViewController.h"
|
||||
|
||||
@interface CalendarEventFormViewController: XLFormViewController
|
||||
|
||||
@end
|
||||
```
|
||||
|
||||
```objc
|
||||
@interface ExamplesFormViewController ()
|
||||
|
||||
@end
|
||||
|
||||
@implementation ExamplesFormViewController
|
||||
|
||||
- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
|
||||
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
|
||||
if (self){
|
||||
[self initializeForm];
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (id)initWithCoder:(NSCoder *)aDecoder {
|
||||
self = [super initWithCoder:aDecoder];
|
||||
if (self){
|
||||
[self initializeForm];
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)initializeForm {
|
||||
// Implementation details covered in the next section.
|
||||
}
|
||||
|
||||
@end
|
||||
```
|
||||
|
||||
##### Implementing the initializeForm method
|
||||
|
||||
To create a form we should declare it through a `XLFormDescriptor` instance and assign it to a `XLFormViewController` instance. As we said XLForm works based on a DSL that hides complex and boilerplate stuff without losing the power and flexibility of hand-made forms.
|
||||
|
||||
@@ -51,50 +118,58 @@ To define a form we use 3 classes:
|
||||
|
||||
A form definition is a `XLFormDescriptor` instance that contains one or more sections (`XLFormSectionDescriptor` instances) and each section contains several rows (`XLFormRowDescriptor` instance). As you may have noticed the DSL structure is analog to the structure of a `UITableView` (Table -->> Sections -- >> Rows). The resulting table-view form's structure (sections and rows order) mirrors the definition's structure.
|
||||
|
||||
#####Let's see part of the iOS Calendar Event Form definition.
|
||||
|
||||
##### Let's see an example implementation of initializeForm to define the iOS Calendar Event Form
|
||||
|
||||
```objc
|
||||
XLFormDescriptor * form;
|
||||
XLFormSectionDescriptor * section;
|
||||
XLFormRowDescriptor * row;
|
||||
- (void)initializeForm {
|
||||
XLFormDescriptor * form;
|
||||
XLFormSectionDescriptor * section;
|
||||
XLFormRowDescriptor * row;
|
||||
|
||||
form = [XLFormDescriptor formDescriptorWithTitle:@"Add Event"];
|
||||
form = [XLFormDescriptor formDescriptorWithTitle:@"Add Event"];
|
||||
|
||||
// First section
|
||||
section = [XLFormSectionDescriptor formSection];
|
||||
[form addFormSection:section];
|
||||
// First section
|
||||
section = [XLFormSectionDescriptor formSection];
|
||||
[form addFormSection:section];
|
||||
|
||||
// Title
|
||||
row = [XLFormRowDescriptor formRowDescriptorWithTag:@"title" rowType:XLFormRowDescriptorTypeText];
|
||||
[row.cellConfigAtConfigure setObject:@"Title" forKey:@"textField.placeholder"];
|
||||
[section addFormRow:row];
|
||||
// Title
|
||||
row = [XLFormRowDescriptor formRowDescriptorWithTag:@"title" rowType:XLFormRowDescriptorTypeText];
|
||||
[row.cellConfigAtConfigure setObject:@"Title" forKey:@"textField.placeholder"];
|
||||
[section addFormRow:row];
|
||||
|
||||
// Location
|
||||
row = [XLFormRowDescriptor formRowDescriptorWithTag:@"location" rowType:XLFormRowDescriptorTypeText];
|
||||
[row.cellConfigAtConfigure setObject:@"Location" forKey:@"textField.placeholder"];
|
||||
[section addFormRow:row];
|
||||
// Location
|
||||
row = [XLFormRowDescriptor formRowDescriptorWithTag:@"location" rowType:XLFormRowDescriptorTypeText];
|
||||
[row.cellConfigAtConfigure setObject:@"Location" forKey:@"textField.placeholder"];
|
||||
[section addFormRow:row];
|
||||
|
||||
// Second Section
|
||||
section = [XLFormSectionDescriptor formSection];
|
||||
[form addFormSection:section];
|
||||
// Second Section
|
||||
section = [XLFormSectionDescriptor formSection];
|
||||
[form addFormSection:section];
|
||||
|
||||
// All-day
|
||||
row = [XLFormRowDescriptor formRowDescriptorWithTag:@"all-day" rowType:XLFormRowDescriptorTypeBooleanSwitch title:@"All-day"];
|
||||
[section addFormRow:row];
|
||||
// All-day
|
||||
row = [XLFormRowDescriptor formRowDescriptorWithTag:@"all-day" rowType:XLFormRowDescriptorTypeBooleanSwitch title:@"All-day"];
|
||||
[section addFormRow:row];
|
||||
|
||||
// Starts
|
||||
row = [XLFormRowDescriptor formRowDescriptorWithTag:@"starts" rowType:XLFormRowDescriptorTypeDateTimeInline title:@"Starts"];
|
||||
row.value = [NSDate dateWithTimeIntervalSinceNow:60*60*24];
|
||||
[section addFormRow:row];
|
||||
// Starts
|
||||
row = [XLFormRowDescriptor formRowDescriptorWithTag:@"starts" rowType:XLFormRowDescriptorTypeDateTimeInline title:@"Starts"];
|
||||
row.value = [NSDate dateWithTimeIntervalSinceNow:60*60*24];
|
||||
[section addFormRow:row];
|
||||
|
||||
self.form = form;
|
||||
}
|
||||
```
|
||||
|
||||
XLForm will load the table-view form from the previously explained definition. The most interesting part is that it will update the table-view form based on the form definition modifications.
|
||||
That means that we are able to make changes on the table-view form adding or removing section definitions or row definitions to the form definition on runtime and you will never need to care again about `NSIndexPath`, `UITableViewDelegate`, `UITableViewDataSource` or other complexities.
|
||||
|
||||
|
||||
**To see more complex form definitions take a look at the example application in the Examples folder of this repository. You can also run the examples on your own device if you wish.** XLForm **has no** dependencies over other pods, anyway the examples project makes use of some cocoapods to show advanced XLForm features.
|
||||
|
||||
## Using XLForm with Storyboards
|
||||
|
||||
* Perform the steps from **How to create a form**
|
||||
* In Interface Builder (IB), drag-and-drop a **UIViewController** onto the Storyboard
|
||||
* Associate your custom form class to the **UIViewController** using the **Identity Inspector**
|
||||
|
||||
How to run XLForm examples
|
||||
---------------------------------
|
||||
|
||||
@@ -107,7 +182,7 @@ How to run XLForm examples
|
||||
|
||||
Rows
|
||||
---------------------
|
||||
####Input Rows
|
||||
#### Input Rows
|
||||
|
||||

|
||||
|
||||
@@ -178,7 +253,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:
|
||||
|
||||
@@ -245,7 +320,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.
|
||||
|
||||
@@ -352,7 +427,7 @@ section.addFormRow(row)
|
||||
self.form = form;
|
||||
|
||||
```
|
||||
####Boolean Rows
|
||||
#### Boolean Rows
|
||||
|
||||
XLForms supports 2 types of boolean controls:
|
||||
|
||||
@@ -370,9 +445,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:
|
||||
|
||||
@@ -394,7 +469,7 @@ You can set the stepper paramaters easily:
|
||||
[row.cellConfigAtConfigure setObject:@100 forKey:@"stepControl.maximumValue"];
|
||||
```
|
||||
|
||||
#####Slider
|
||||
##### Slider
|
||||
|
||||
XLForms supports counting using UISlider control:
|
||||
|
||||
@@ -415,11 +490,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.
|
||||
|
||||
@@ -615,6 +690,8 @@ XLForm sets up `rowDescriptor` property using the `XLFormRowDescriptor` instance
|
||||
|
||||
The developer is responsible for update its views with the `rowDescriptor` value as well as set the selected value to `rowDescriptor` from within the custom selector view controller.
|
||||
|
||||
> Note: the properties `viewControllerClass`, `viewControllerNibName` or `viewControllerStoryboardId` are mutually exclusive and are used by `XLFormButtonCell` and `XLFormSelectorCell`. If you create a custom cell then you are responsible for using them.
|
||||
|
||||
|
||||
#### Another example
|
||||
|
||||
@@ -690,7 +767,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.
|
||||
@@ -700,7 +777,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:
|
||||
|
||||
@@ -789,6 +866,7 @@ You may want to set up another properties of the `UITableViewCell`. To set up an
|
||||
You just have to add the properties to `cellConfig` or `cellConfigAtConfigure` dictionary property of `XLFormRowDescriptor`.
|
||||
The main difference between `cellConfig` and `cellConfigAtConfigure` is the time when the property is set up. `cellConfig` properties are set up each time a cell is about to be displayed. `cellConfigAtConfigure`, on the other hand, set up the property just after the init method of the cell is called and only one time.
|
||||
|
||||
Since version 3.3.0 you can also use `cellConfigForSelector` to configure how the cells of the `XLFormOptionsViewController` look like when it is shown for a selector row.
|
||||
|
||||
For instance if you want to set up the placeholder you can do the following:
|
||||
|
||||
@@ -804,7 +882,7 @@ Let's see how to change the color of the cell label:
|
||||
|
||||
```objc
|
||||
row = [XLFormRowDescriptor formRowDescriptorWithTag:@"title" rowType:XLFormRowDescriptorTypeText];
|
||||
[row.cellConfigAtConfigure setObject:[UIColor red] forKey:@"textLabel.textColor"];
|
||||
[row.cellConfig setObject:[UIColor redColor] forKey:@"textLabel.textColor"];
|
||||
[section addFormRow:row];
|
||||
```
|
||||
|
||||
@@ -819,6 +897,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`.
|
||||
@@ -930,7 +1027,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:
|
||||
|
||||
@@ -999,6 +1096,30 @@ This is how you can set them:
|
||||
[row.cellConfigAtConfigure setObject:@(UIReturnKeyGo) forKey:@"nextReturnKeyType"];
|
||||
```
|
||||
|
||||
#### How to change the height of one cell
|
||||
|
||||
If you want to change the height for all cells of one class you should subclass that cell and override the class method `formDescriptorCellHeightForRowDescriptor`.
|
||||
If you want to change the height of one individual cell then you can set that height to the `height` property of XLFormRowDescripto like this:
|
||||
```
|
||||
XLFormRowDescriptor* row = ...
|
||||
row.height = 55;
|
||||
```
|
||||
|
||||
#### How to change the appearance of the cells of a selector view controller (XLFormOptionsViewController)
|
||||
|
||||
To change the appearance of the cells of a XLFormOptionsViewController you can use the `cellConfigForSelector` property on the row descriptor.
|
||||
Example:
|
||||
```
|
||||
[row.cellConfigForSelector setObject:[UIColor redColor] forKey:@"textLabel.textColor"];
|
||||
```
|
||||
|
||||
#### How to limit the characters of a XLFormTextFieldCell or a XLFormTextViewCell
|
||||
|
||||
You can make this happen using the `textFieldMaxNumberOfCharacters` and the `textViewMaxNumberOfCharacters` respectively.
|
||||
```
|
||||
[row.cellConfigAtConfigure setObject:@(20) forKey:@"textViewMaxNumberOfCharacters"];
|
||||
```
|
||||
|
||||
Installation
|
||||
--------------------------
|
||||
|
||||
@@ -1010,15 +1131,7 @@ Installation
|
||||
|
||||
XLForm **has no** dependencies over other pods.
|
||||
|
||||
## Carthage
|
||||
|
||||
In your `Cartfile` add:
|
||||
|
||||
```
|
||||
github "xmartlabs/XLForm" ~> 3.0
|
||||
```
|
||||
|
||||
### How to use master branch
|
||||
#### How to use master branch
|
||||
|
||||
Often master branch contains most recent features and latest fixes. On the other hand this features was not fully tested and changes on master may occur at any time. For the previous reasons I stongly recommend to fork the repository and manage the updates from master on your own making the proper pull on demand.
|
||||
|
||||
@@ -1029,7 +1142,7 @@ To use xmartlabs master branch.....
|
||||
|
||||
You can replace the repository URL for your forked version url if you wish.
|
||||
|
||||
### How to use XLForm in Swift files
|
||||
#### How to use XLForm in Swift files
|
||||
|
||||
If you have installed XLForm with cocoapods and have set `use_frameworks!` in your Podfile, you can add `import XLForm` to any Swift file.
|
||||
|
||||
@@ -1037,6 +1150,31 @@ If you are using cocoapods but have not set `use_frameworks!` in your Podfile, a
|
||||
|
||||
For further details on how to create and configure the bridging header file visit [*Importing Objective-C into Swift*](https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html "Importing Objective-C into Swift").
|
||||
|
||||
|
||||
## Carthage
|
||||
|
||||
In your `Cartfile` add:
|
||||
|
||||
```
|
||||
github "xmartlabs/XLForm" ~> 3.0
|
||||
```
|
||||
|
||||
## Using git submodules
|
||||
|
||||
* Clone XLForm as a git [submodule](http://git-scm.com/docs/git-submodule) by running the following command from your project root git folder.
|
||||
|
||||
```bash
|
||||
$ git submodule add https://github.com/xmartlabs/XLForm.git
|
||||
```
|
||||
|
||||
* Open XLForm folder that was created by the previous git submodule command and drag the XLForm.xcodeproj into the Project Navigator of your application's Xcode project.
|
||||
|
||||
* Select the XLForm.xcodeproj in the Project Navigator and verify the deployment target matches with your application deployment target.
|
||||
|
||||
* Select your project in the Xcode Navigation and then select your application target from the sidebar. Next select the "General" tab and click on the + button under the "Embedded Binaries" section.
|
||||
|
||||
* Select `XLForm.framework` and we are done!
|
||||
|
||||
Requirements
|
||||
-----------------------------
|
||||
|
||||
@@ -1048,124 +1186,7 @@ Requirements
|
||||
Release Notes
|
||||
--------------
|
||||
|
||||
Version 3.1.1
|
||||
* Allow setting width percentage on UITextView
|
||||
* Added custom inline row example
|
||||
* Fixed bug where XLFormImageCell was not added to project
|
||||
* Add ability to `end editing` on scroll
|
||||
* Other bugs and refactor
|
||||
|
||||
Version 3.1.0
|
||||
* Added Carthage support
|
||||
* Added NSCoding protocol
|
||||
* Allowed HTTP connections
|
||||
* Several bugfixes and improvements.
|
||||
|
||||
Version 3.0.2
|
||||
* Fix issue when inline pickers expand beyond table.
|
||||
|
||||
Version 3.0.1
|
||||
|
||||
* Improvements and bug fixes.
|
||||
* Ability to left, right align textfields. Ability to set up a minimum textField width.
|
||||
* If form is being shown, assigning a new form automatically reload the tableview.
|
||||
* Update objective-c and swift example projects.
|
||||
* Swift compatibility fixes.
|
||||
* Long email validation added.
|
||||
* Fixed row copy issue, now valueTransformer value is copied.
|
||||
* Fixed step counter row layout issues.
|
||||
* Fixed issue "Last form field hides beneath enabled navigation controller's toolbar".
|
||||
* Fixed issue "Navigating between cells using bottom navigation buttons causes table cell dividers to disappear".
|
||||
* Use UIAlertController instead UIActionSheet/UIAlertView if possible.
|
||||
* Hidden and disabled rows resign first responder before changing state.
|
||||
* onChangeBlock added to rowDescriptor.
|
||||
* use tintColor as default button row color.
|
||||
* By default accessoryView is no longer shown for inline rows.
|
||||
* Fix NSBundle issues to use XLForm as dynamic framework.
|
||||
|
||||
Version 3.0.0
|
||||
|
||||
* `hidden`, `disable` properties added to `XLFormRowDescriptor`. `@YES` `@NO` or a `NSPredicate` can be used to hide, disable de row.
|
||||
* `hidden` property added to `XLFormSectionDescriptor`. `@YES` `@NO` or a `NSPredicate` can be used to hide the section.
|
||||
* Added `XLFormRowDescriptorTypeCountDownTimerInline` and `XLFormRowDescriptorTypeCountDownTimer` row type with an example.
|
||||
* Deleted `dateFormatter` property and added support to use the `NSValueTransformer` to convert the selected object to a NSString in the XLFormDateCell class.
|
||||
|
||||
* Added `XLFormRowDescriptorTypeCountDownTimerInline` and `XLFormRowDescriptorTypeCountDownTimer` row type with an example.
|
||||
* Deleted `dateFormatter` property and added support to use the `NSValueTransformer` to convert the selected object to a NSString in the XLFormDateCell class.
|
||||
|
||||
|
||||
Version 2.2.0
|
||||
|
||||
* Fixed "(null)" caption when `XLFormRowDescriptorTypeSelectorLeftRight` row required error message is shown.
|
||||
* Refresh the cell content instead of recreating one, when the form get back from a selection.
|
||||
* Added XLFormRowDescriptor to validations error to easily show an error mask.
|
||||
* Use row tag in validation error message if row does not have a title. It is also possible to set up a custom message if needed
|
||||
* Added a convenience method to add a XLFormRowDescriptor instance before another one.
|
||||
* Allow nil values in cellConfig and cellConfigAtConfigure.
|
||||
* Fix constraints for textFieldCell when it is configured to be right aligned.
|
||||
* Add asterisk to required segmentedCells if needed.
|
||||
* Fail validation for empty strings and NSNull on required rows.
|
||||
* Segue support added to buttons and selectors.
|
||||
* Ability to configure a storyboardId or a viewController nibName to by used by button and selector rows as presented view controller.
|
||||
* Fix scrolling to top when status bar is tapped.
|
||||
* Fix wrong type of XLFormRowDescriptorTypeDecimal row. Now it's converted to NSNumber.
|
||||
* Fix issue: XLFormRegexValidator only checks regex validation for NSStrings, not working for number.
|
||||
* Callconfigure method from awakeFromNib on XLFormBaseCell.
|
||||
* Assign form.delegate from inside setForm: method.
|
||||
* Added custom cell, validation, reordering, can insert, can delete examples.
|
||||
* Added support for inputAccessoryView. Default input accessory view allows to navigate among rows. Fully optionally and customizable.
|
||||
* Added suport for row navigation. Fully optionally and customizable.
|
||||
* beginEditing: endEditing: methods added. These method are called each time a row gains / loses firstResponder. They bring the ability to do UI changes.
|
||||
* Read Only mode added. `disable` property added to XLFormDescriptor class.
|
||||
* Rename `label` XLFormTextViewCell property as `textLabel`.
|
||||
* fix position of multivalued section accessory view.
|
||||
* Can delete, can delete, can reorder section mode added. it's possible to enable some of them, don't need to enable all modes.
|
||||
|
||||
Version 2.1.0
|
||||
|
||||
* Change `XLFormRowDescriptorTypeText`, `XLFormRowDescriptorTypeName` and `XLFormRowDescriptorTypeTextView` keyboard type to `UIKeyboardTypeDefault`.
|
||||
* Added `XLFormRowDescriptorTypeInfo` row type and example.
|
||||
* Added `XLFormRowDescriptorTypeSelectorPopover` row type and example.
|
||||
* CI added. Created Test project into Tests folder and set up Travis.
|
||||
* Documented how to customize UI. Added an example.
|
||||
* Now XLFormViewController extends from UIViewController instead of UITableViewController.
|
||||
* Added tableView property as a XLFormViewController IBOutlet.
|
||||
* Added support for storyboard reuse identifier and nib file.
|
||||
* Button selection can be handled using a selector or block.
|
||||
* Added addAsteriskToRequiredRowsTitle property to XLFormDescriptor. NO is used as value by default.
|
||||
* Image cell has been removed because it depends on AFNetworking and now needs to be implemented as a custom cell. You can find the image custom cell in Examples/Others/CustomCells.
|
||||
|
||||
Version 2.0.0 (cocoaPod)
|
||||
|
||||
* Added `XLFormRowDescriptorTypeMultipleSelector` row type and example.
|
||||
* Added `XLFormRowDescriptorTypeSelectorPickerView` row type and example.
|
||||
* Added `XLFormRowDescriptorTypeSelectorPickerViewInline` row type and example.
|
||||
* Added generic way to create inline selector rows.
|
||||
* Ability to customize row animations.
|
||||
* `(NSDictionary *)formValues;` XLFormViewController method added in order to get raw form data.
|
||||
* Added `XLFormRowDescriptorTypeSelectorSegmentedControl` row type and example.
|
||||
* AFNetworking dependency removed.
|
||||
* Added `XLFormRowDescriptorTypeStepCounter` row type and related example.
|
||||
|
||||
|
||||
Version 1.0.1 (cocoaPod)
|
||||
|
||||
* Added storyboard example.
|
||||
* Added button `XLFormRowDescriptorTypeButton` example.
|
||||
* Documented how to add a custom row.
|
||||
* Fixed issues: [#2](https://github.com/xmartlabs/XLForm/issues/2 "#2"), [#3](https://github.com/xmartlabs/XLForm/issues/3 "#3"), [#27](https://github.com/xmartlabs/XLForm/issues/27 "#27"), [#38](https://github.com/xmartlabs/XLForm/issues/38 "#38").
|
||||
* Fixed crash caused by inline date rows. [#6](https://github.com/xmartlabs/XLForm/issues/6 "#6")
|
||||
* Fixed ipad issue *invalid cell layout*. [#10](https://github.com/xmartlabs/XLForm/issues/10 "#10")
|
||||
* New convenience methods to insert sections dinamically. [#13](https://github.com/xmartlabs/XLForm/pull/13 "#13")
|
||||
* Change default label style to `UIFontTextStyleBody`. [#18](https://github.com/xmartlabs/XLForm/issues/18 "#18")
|
||||
* Added step counter row, `XLFormRowDescriptorTypeStepCounter`.
|
||||
* Added `initWithCoder` initializer to `XLFormViewController`. [#32](https://github.com/xmartlabs/XLForm/issues/32 "#32").
|
||||
* Added a convenience method to deselect a `XLFormRowDescriptor`. `-(void)deselectFormRow:(XLFormRowDescriptor *)row;`. [#33](https://github.com/xmartlabs/XLForm/issues/33 "#33").
|
||||
|
||||
|
||||
Version 1.0.0 (cocoaPod)
|
||||
|
||||
* Initial release
|
||||
Have a look at the [CHANGELOG](https://github.com/xmartlabs/XLForm/blob/master/CHANGELOG.md)
|
||||
|
||||
Author
|
||||
-----------------
|
||||
|
||||
@@ -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', 'iphonesimulator10.2')
|
||||
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=10.1,name=iPhone 7' -configuration Release clean test | xcpretty -c ; exit ${PIPESTATUS[0]}") rescue nil
|
||||
end
|
||||
|
||||
def tests_failed
|
||||
|
||||
+5
-3
@@ -1,7 +1,9 @@
|
||||
source 'https://github.com/CocoaPods/Specs.git'
|
||||
xcodeproj 'XLForm Tests'
|
||||
project 'XLForm Tests'
|
||||
inhibit_all_warnings!
|
||||
|
||||
platform :ios, '7.0'
|
||||
pod 'Expecta', '~> 0.3.0'
|
||||
pod 'XLForm', :path => '../'
|
||||
target 'XLForm Tests' do
|
||||
pod 'Expecta', '~> 0.3.0'
|
||||
pod 'XLForm', :path => '../'
|
||||
end
|
||||
|
||||
@@ -7,6 +7,8 @@
|
||||
objects = {
|
||||
|
||||
/* 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 */; };
|
||||
@@ -15,11 +17,12 @@
|
||||
28657A54199154EE00CE8180 /* XLFormValidatorsTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 28657A53199154EE00CE8180 /* XLFormValidatorsTests.m */; };
|
||||
3C5B9B7A1AC0BA33000AF1BA /* XLFormExampleTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C5B9B791AC0BA33000AF1BA /* XLFormExampleTest.m */; };
|
||||
3C9817861AC30616003F6ABD /* UITextField+Test.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C9817851AC30616003F6ABD /* UITextField+Test.m */; };
|
||||
803CF19E12514D00A5080A99 /* libPods.a in Frameworks */ = {isa = PBXBuildFile; fileRef = CEC7E8601D7342BFAF4C4060 /* libPods.a */; };
|
||||
6233D65F1D7DF022000E7716 /* XLTestTextViewProperties.m in Sources */ = {isa = PBXBuildFile; fileRef = 6233D65E1D7DF022000E7716 /* XLTestTextViewProperties.m */; };
|
||||
BFD111841AD8323900943D23 /* XLTestHideAndShow.m in Sources */ = {isa = PBXBuildFile; fileRef = BFD111831AD8323900943D23 /* XLTestHideAndShow.m */; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
03885A901D7DD3BD00CC183A /* XLTestTextFieldProperties.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = XLTestTextFieldProperties.m; path = Test/XLTestTextFieldProperties.m; sourceTree = "<group>"; };
|
||||
28657A3A1990879200CE8180 /* XLForm Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "XLForm Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
28657A3D1990879200CE8180 /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; };
|
||||
28657A3F1990879200CE8180 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; };
|
||||
@@ -30,13 +33,17 @@
|
||||
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>"; };
|
||||
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; };
|
||||
/* End PBXFileReference section */
|
||||
|
||||
/* Begin PBXFrameworksBuildPhase section */
|
||||
@@ -47,7 +54,7 @@
|
||||
28657A3E1990879200CE8180 /* XCTest.framework in Frameworks */,
|
||||
28657A421990879200CE8180 /* UIKit.framework in Frameworks */,
|
||||
28657A401990879200CE8180 /* Foundation.framework in Frameworks */,
|
||||
803CF19E12514D00A5080A99 /* libPods.a in Frameworks */,
|
||||
17538872B9BB29167787CF50 /* libPods-XLForm Tests.a in Frameworks */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
@@ -79,6 +86,7 @@
|
||||
28657A3F1990879200CE8180 /* Foundation.framework */,
|
||||
28657A411990879200CE8180 /* UIKit.framework */,
|
||||
CEC7E8601D7342BFAF4C4060 /* libPods.a */,
|
||||
E68572C5C8328F0F177BBCA1 /* libPods-XLForm Tests.a */,
|
||||
);
|
||||
name = Frameworks;
|
||||
sourceTree = "<group>";
|
||||
@@ -111,6 +119,8 @@
|
||||
28657A5019914F9700CE8180 /* XLTestCase.h */,
|
||||
28657A5119914F9700CE8180 /* XLTestCase.m */,
|
||||
28657A53199154EE00CE8180 /* XLFormValidatorsTests.m */,
|
||||
03885A901D7DD3BD00CC183A /* XLTestTextFieldProperties.m */,
|
||||
6233D65E1D7DF022000E7716 /* XLTestTextViewProperties.m */,
|
||||
);
|
||||
name = Tests;
|
||||
sourceTree = "<group>";
|
||||
@@ -129,6 +139,8 @@
|
||||
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>";
|
||||
@@ -140,11 +152,12 @@
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = 28657A4C1990879200CE8180 /* Build configuration list for PBXNativeTarget "XLForm Tests" */;
|
||||
buildPhases = (
|
||||
6B058765CC1143829C6943B9 /* Check Pods Manifest.lock */,
|
||||
6B058765CC1143829C6943B9 /* [CP] Check Pods Manifest.lock */,
|
||||
28657A361990879200CE8180 /* Sources */,
|
||||
28657A371990879200CE8180 /* Frameworks */,
|
||||
28657A381990879200CE8180 /* Resources */,
|
||||
3E5FCF05A57F40C6AF367F6D /* Copy Pods Resources */,
|
||||
3E5FCF05A57F40C6AF367F6D /* [CP] Copy Pods Resources */,
|
||||
6A2C507B76209618EDA57426 /* [CP] Embed Pods Frameworks */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
@@ -192,34 +205,49 @@
|
||||
/* End PBXResourcesBuildPhase section */
|
||||
|
||||
/* Begin PBXShellScriptBuildPhase section */
|
||||
3E5FCF05A57F40C6AF367F6D /* Copy Pods Resources */ = {
|
||||
3E5FCF05A57F40C6AF367F6D /* [CP] Copy Pods Resources */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
inputPaths = (
|
||||
);
|
||||
name = "Copy Pods Resources";
|
||||
name = "[CP] Copy Pods Resources";
|
||||
outputPaths = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
shellPath = /bin/sh;
|
||||
shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods/Pods-resources.sh\"\n";
|
||||
shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-XLForm Tests/Pods-XLForm Tests-resources.sh\"\n";
|
||||
showEnvVarsInLog = 0;
|
||||
};
|
||||
6B058765CC1143829C6943B9 /* Check Pods Manifest.lock */ = {
|
||||
6A2C507B76209618EDA57426 /* [CP] Embed Pods Frameworks */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
inputPaths = (
|
||||
);
|
||||
name = "Check Pods Manifest.lock";
|
||||
name = "[CP] Embed Pods Frameworks";
|
||||
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 = "\"${SRCROOT}/Pods/Target Support Files/Pods-XLForm Tests/Pods-XLForm Tests-frameworks.sh\"\n";
|
||||
showEnvVarsInLog = 0;
|
||||
};
|
||||
6B058765CC1143829C6943B9 /* [CP] Check Pods Manifest.lock */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
inputPaths = (
|
||||
);
|
||||
name = "[CP] 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 # 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";
|
||||
showEnvVarsInLog = 0;
|
||||
};
|
||||
/* End PBXShellScriptBuildPhase section */
|
||||
@@ -231,7 +259,9 @@
|
||||
files = (
|
||||
28657A54199154EE00CE8180 /* XLFormValidatorsTests.m in Sources */,
|
||||
28657A5219914F9700CE8180 /* XLTestCase.m in Sources */,
|
||||
03885A911D7DD3BD00CC183A /* XLTestTextFieldProperties.m in Sources */,
|
||||
BFD111841AD8323900943D23 /* XLTestHideAndShow.m in Sources */,
|
||||
6233D65F1D7DF022000E7716 /* XLTestTextViewProperties.m in Sources */,
|
||||
3C5B9B7A1AC0BA33000AF1BA /* XLFormExampleTest.m in Sources */,
|
||||
3C9817861AC30616003F6ABD /* UITextField+Test.m in Sources */,
|
||||
);
|
||||
@@ -266,7 +296,7 @@
|
||||
};
|
||||
28657A4D1990879200CE8180 /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = C6B20EA1A9D9591335BEE81F /* Pods.debug.xcconfig */;
|
||||
baseConfigurationReference = 35038A584FCFD0693D23F189 /* Pods-XLForm Tests.debug.xcconfig */;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
|
||||
@@ -305,6 +335,7 @@
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
INFOPLIST_FILE = "XLForm Tests/XLForm Tests-Info.plist";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 7.1;
|
||||
LIBRARY_SEARCH_PATHS = "$(inherited)";
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SDKROOT = iphoneos;
|
||||
@@ -314,7 +345,7 @@
|
||||
};
|
||||
28657A4E1990879200CE8180 /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 8ADC094C94CA7ABBB8134573 /* Pods.release.xcconfig */;
|
||||
baseConfigurationReference = 3BE0FA85B15844909EF36AB4 /* Pods-XLForm Tests.release.xcconfig */;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
|
||||
@@ -347,6 +378,7 @@
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
INFOPLIST_FILE = "XLForm Tests/XLForm Tests-Info.plist";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 7.1;
|
||||
LIBRARY_SEARCH_PATHS = "$(inherited)";
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SDKROOT = iphoneos;
|
||||
VALIDATE_PRODUCT = YES;
|
||||
|
||||
@@ -0,0 +1,66 @@
|
||||
//
|
||||
// XLTestTextFieldProperties.m
|
||||
// XLForm Tests
|
||||
//
|
||||
// Created by Claus on 9/5/16.
|
||||
//
|
||||
//
|
||||
|
||||
#import "XLTestCase.h"
|
||||
#import <XLForm/XLFormTextFieldCell.h>
|
||||
#import <UIKit/UIKit.h>
|
||||
|
||||
@interface XLTestTextFieldProperties : XLTestCase
|
||||
@end
|
||||
|
||||
@implementation XLTestTextFieldProperties
|
||||
|
||||
- (void)testPropertiesGetSet
|
||||
{
|
||||
// Get the tableView
|
||||
UITableView * tableView = self.formController.tableView;
|
||||
|
||||
UITableViewCell * cell = [self.formController tableView:tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];
|
||||
|
||||
// Check if the cell contains the correct properties
|
||||
expect(cell).to.beKindOf([XLFormTextFieldCell class]);
|
||||
XLFormTextFieldCell * textFieldCell = (XLFormTextFieldCell *)cell;
|
||||
expect(textFieldCell.textFieldLengthPercentage).to.equal(0.3);
|
||||
expect(textFieldCell.textFieldMaxNumberOfCharacters).to.equal(10);
|
||||
}
|
||||
|
||||
- (void)testMaxNumbersOfCharacters
|
||||
{
|
||||
// Get the tableView
|
||||
UITableView * tableView = self.formController.tableView;
|
||||
|
||||
UITableViewCell * cell = [self.formController tableView:tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];
|
||||
expect(cell).to.beKindOf([XLFormTextFieldCell class]);
|
||||
XLFormTextFieldCell * textFieldCell = (XLFormTextFieldCell *)cell;
|
||||
|
||||
// Check if range check works
|
||||
expect(cell).to.conformTo(@protocol(UITextFieldDelegate));
|
||||
id<UITextFieldDelegate> textFieldDelegate = (id<UITextFieldDelegate>)cell;
|
||||
NSRange range = NSMakeRange(0, 0);
|
||||
expect([textFieldDelegate textField:textFieldCell.textField shouldChangeCharactersInRange:range replacementString:@"123"]).to.beTruthy();
|
||||
expect([textFieldDelegate textField:textFieldCell.textField shouldChangeCharactersInRange:range replacementString:@"1234567890"]).to.beTruthy();
|
||||
expect([textFieldDelegate textField:textFieldCell.textField shouldChangeCharactersInRange:range replacementString:@"12345678901"]).to.beFalsy();
|
||||
}
|
||||
|
||||
#pragma mark - Build Form
|
||||
|
||||
-(void)buildForm
|
||||
{
|
||||
XLFormDescriptor * form = [XLFormDescriptor formDescriptor];
|
||||
XLFormSectionDescriptor * section = [XLFormSectionDescriptor formSection];
|
||||
[form addFormSection:section];
|
||||
|
||||
XLFormRowDescriptor * row = [XLFormRowDescriptor formRowDescriptorWithTag:nil rowType:XLFormRowDescriptorTypeText];
|
||||
[row.cellConfigAtConfigure setObject:@(0.3) forKey:XLFormTextFieldLengthPercentage];
|
||||
[row.cellConfigAtConfigure setObject:@(10) forKey:XLFormTextFieldMaxNumberOfCharacters];
|
||||
[section addFormRow:row];
|
||||
|
||||
self.formController.form = form;
|
||||
}
|
||||
|
||||
@end
|
||||
@@ -0,0 +1,66 @@
|
||||
//
|
||||
// XLTestTextViewProperties.m
|
||||
// XLForm Tests
|
||||
//
|
||||
// Created by Claus on 9/5/16.
|
||||
//
|
||||
//
|
||||
|
||||
#import "XLTestCase.h"
|
||||
#import <XLForm/XLFormTextViewCell.h>
|
||||
#import <UIKit/UIKit.h>
|
||||
|
||||
@interface XLTestTextViewProperties : XLTestCase
|
||||
@end
|
||||
|
||||
@implementation XLTestTextViewProperties
|
||||
|
||||
- (void)testPropertiesGetSet
|
||||
{
|
||||
// Get the tableView
|
||||
UITableView * tableView = self.formController.tableView;
|
||||
|
||||
UITableViewCell * cell = [self.formController tableView:tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];
|
||||
|
||||
// Check if the cell contains the correct properties
|
||||
expect(cell).to.beKindOf([XLFormTextViewCell class]);
|
||||
XLFormTextViewCell * textViewCell = (XLFormTextViewCell *)cell;
|
||||
expect(textViewCell.textViewLengthPercentage).to.equal(0.3);
|
||||
expect(textViewCell.textViewMaxNumberOfCharacters).to.equal(10);
|
||||
}
|
||||
|
||||
- (void)testMaxNumbersOfCharacters
|
||||
{
|
||||
// Get the tableView
|
||||
UITableView * tableView = self.formController.tableView;
|
||||
|
||||
UITableViewCell * cell = [self.formController tableView:tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];
|
||||
expect(cell).to.beKindOf([XLFormTextViewCell class]);
|
||||
XLFormTextViewCell * textViewCell = (XLFormTextViewCell *)cell;
|
||||
|
||||
// Check if range check works
|
||||
expect(cell).to.conformTo(@protocol(UITextViewDelegate));
|
||||
id<UITextViewDelegate> textFieldDelegate = (id<UITextViewDelegate>)cell;
|
||||
NSRange range = NSMakeRange(0, 0);
|
||||
expect([textFieldDelegate textView:textViewCell.textView shouldChangeTextInRange:range replacementText:@"123"]).to.beTruthy();
|
||||
expect([textFieldDelegate textView:textViewCell.textView shouldChangeTextInRange:range replacementText:@"1234567890"]).to.beTruthy();
|
||||
expect([textFieldDelegate textView:textViewCell.textView shouldChangeTextInRange:range replacementText:@"12345678901"]).to.beFalsy();
|
||||
}
|
||||
|
||||
#pragma mark - Build Form
|
||||
|
||||
-(void)buildForm
|
||||
{
|
||||
XLFormDescriptor * form = [XLFormDescriptor formDescriptor];
|
||||
XLFormSectionDescriptor * section = [XLFormSectionDescriptor formSection];
|
||||
[form addFormSection:section];
|
||||
|
||||
XLFormRowDescriptor * row = [XLFormRowDescriptor formRowDescriptorWithTag:nil rowType:XLFormRowDescriptorTypeTextView];
|
||||
[row.cellConfigAtConfigure setObject:@(0.3) forKey:XLFormTextViewLengthPercentage];
|
||||
[row.cellConfigAtConfigure setObject:@(10) forKey:XLFormTextViewMaxNumberOfCharacters];
|
||||
[section addFormRow:row];
|
||||
|
||||
self.formController.form = form;
|
||||
}
|
||||
|
||||
@end
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'XLForm'
|
||||
s.version = '3.1.1'
|
||||
s.version = '3.3.0'
|
||||
s.license = { :type => 'MIT' }
|
||||
s.summary = 'XLForm is the most flexible and powerful iOS library to create dynamic table-view forms.'
|
||||
s.description = <<-DESC
|
||||
|
||||
@@ -561,7 +561,7 @@
|
||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
|
||||
COPY_PHASE_STRIP = NO;
|
||||
CURRENT_PROJECT_VERSION = 3.0.2;
|
||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
|
||||
@implementation XLFormBaseCell
|
||||
|
||||
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
|
||||
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
|
||||
{
|
||||
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
|
||||
if (self) {
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
|
||||
@implementation XLFormButtonCell
|
||||
|
||||
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
|
||||
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
|
||||
{
|
||||
return [super initWithStyle:style reuseIdentifier:reuseIdentifier];
|
||||
}
|
||||
@@ -46,20 +46,18 @@
|
||||
[super update];
|
||||
BOOL isDisabled = self.rowDescriptor.isDisabled;
|
||||
self.textLabel.text = self.rowDescriptor.title;
|
||||
BOOL notASimpleAction = self.rowDescriptor.action.viewControllerClass || [self.rowDescriptor.action.viewControllerStoryboardId length] != 0 || [self.rowDescriptor.action.viewControllerNibName length] != 0 || [self.rowDescriptor.action.formSegueIdentifier length] != 0 || self.rowDescriptor.action.formSegueClass;
|
||||
self.textLabel.textAlignment = notASimpleAction ? NSTextAlignmentNatural : NSTextAlignmentCenter;
|
||||
self.accessoryType = !notASimpleAction || isDisabled ? UITableViewCellAccessoryNone : UITableViewCellAccessoryDisclosureIndicator;
|
||||
BOOL simpleAction = !(self.rowDescriptor.action.viewControllerClass || [self.rowDescriptor.action.viewControllerStoryboardId length] != 0 || [self.rowDescriptor.action.viewControllerNibName length] != 0 || [self.rowDescriptor.action.formSegueIdentifier length] != 0 || self.rowDescriptor.action.formSegueClass);
|
||||
self.textLabel.textAlignment = !simpleAction ? NSTextAlignmentNatural : NSTextAlignmentCenter;
|
||||
self.accessoryType = simpleAction || isDisabled ? UITableViewCellAccessoryNone : UITableViewCellAccessoryDisclosureIndicator;
|
||||
self.editingAccessoryType = self.accessoryType;
|
||||
self.selectionStyle = isDisabled ? UITableViewCellSelectionStyleNone : UITableViewCellSelectionStyleDefault;
|
||||
|
||||
if (!notASimpleAction){
|
||||
if (simpleAction){
|
||||
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)];
|
||||
}
|
||||
else{
|
||||
self.textLabel.textColor = nil;
|
||||
}
|
||||
|
||||
self.detailTextLabel.text = self.rowDescriptor.value;
|
||||
}
|
||||
|
||||
|
||||
@@ -38,5 +38,6 @@ typedef NS_ENUM(NSUInteger, XLFormDateDatePickerMode) {
|
||||
@property (nonatomic) NSDate *minimumDate;
|
||||
@property (nonatomic) NSDate *maximumDate;
|
||||
@property (nonatomic) NSInteger minuteInterval;
|
||||
@property (nonatomic) NSLocale *locale;
|
||||
|
||||
@end
|
||||
|
||||
@@ -179,7 +179,9 @@
|
||||
return [NSDateFormatter localizedStringFromDate:date dateStyle:NSDateFormatterNoStyle timeStyle:NSDateFormatterShortStyle];
|
||||
}
|
||||
else if ([self.rowDescriptor.rowType isEqualToString:XLFormRowDescriptorTypeCountDownTimer] || [self.rowDescriptor.rowType isEqualToString:XLFormRowDescriptorTypeCountDownTimerInline]){
|
||||
NSDateComponents *time = [[NSCalendar currentCalendar] components:NSCalendarUnitHour | NSCalendarUnitMinute fromDate:date];
|
||||
NSCalendar *calendar = [NSCalendar currentCalendar];
|
||||
[calendar setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
|
||||
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];
|
||||
@@ -195,6 +197,7 @@
|
||||
}
|
||||
else if ([self.rowDescriptor.rowType isEqualToString:XLFormRowDescriptorTypeCountDownTimer] || [self.rowDescriptor.rowType isEqualToString:XLFormRowDescriptorTypeCountDownTimerInline]){
|
||||
datePicker.datePickerMode = UIDatePickerModeCountDownTimer;
|
||||
datePicker.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0];
|
||||
}
|
||||
else{
|
||||
datePicker.datePickerMode = UIDatePickerModeDateAndTime;
|
||||
@@ -208,6 +211,10 @@
|
||||
|
||||
if (self.maximumDate)
|
||||
datePicker.maximumDate = self.maximumDate;
|
||||
|
||||
if (self.locale) {
|
||||
datePicker.locale = self.locale;
|
||||
}
|
||||
}
|
||||
|
||||
#pragma mark - Properties
|
||||
@@ -227,9 +234,7 @@
|
||||
- (void)datePickerValueChanged:(UIDatePicker *)sender
|
||||
{
|
||||
self.rowDescriptor.value = sender.date;
|
||||
[self update];
|
||||
[self setNeedsLayout];
|
||||
|
||||
[self.formViewController updateFormRow:self.rowDescriptor];
|
||||
}
|
||||
|
||||
-(void)setFormDatePickerMode:(XLFormDateDatePickerMode)formDatePickerMode
|
||||
|
||||
@@ -90,6 +90,10 @@
|
||||
}]];
|
||||
}
|
||||
|
||||
[alertController addAction:[UIAlertAction actionWithTitle: NSLocalizedString(@"Cancel", nil)
|
||||
style: UIAlertActionStyleCancel
|
||||
handler: nil]];
|
||||
|
||||
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
|
||||
alertController.modalPresentationStyle = UIModalPresentationPopover;
|
||||
alertController.popoverPresentationController.sourceView = self.contentView;
|
||||
|
||||
@@ -176,6 +176,19 @@
|
||||
return option.httpParameterKey;
|
||||
}
|
||||
|
||||
- (id) chooseNewRightValueFromOption:(XLFormLeftRightSelectorOption*)option
|
||||
{
|
||||
switch (option.leftValueChangePolicy) {
|
||||
case XLFormLeftRightSelectorOptionLeftValueChangePolicyChooseLastOption:
|
||||
return [option.rightOptions lastObject];
|
||||
case XLFormLeftRightSelectorOptionLeftValueChangePolicyChooseFirstOption:
|
||||
return [option.rightOptions firstObject];
|
||||
case XLFormLeftRightSelectorOptionLeftValueChangePolicyNullifyRightValue:
|
||||
return nil;
|
||||
}
|
||||
return nil;
|
||||
}
|
||||
|
||||
|
||||
#pragma mark - Actions
|
||||
|
||||
@@ -207,7 +220,7 @@
|
||||
[alertController addAction:[UIAlertAction actionWithTitle:[leftOption.leftValue displayText]
|
||||
style:UIAlertActionStyleDefault
|
||||
handler:^(UIAlertAction *action) {
|
||||
weakSelf.rowDescriptor.value = nil;
|
||||
weakSelf.rowDescriptor.value = [self chooseNewRightValueFromOption:leftOption];
|
||||
weakSelf.rowDescriptor.leftRightSelectorLeftOptionSelected = [self leftOptionForDescription:[leftOption.leftValue displayText]].leftValue;
|
||||
[weakSelf.formViewController updateFormRow:weakSelf.rowDescriptor];
|
||||
}]];
|
||||
@@ -215,6 +228,7 @@
|
||||
|
||||
[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
|
||||
@@ -231,6 +245,7 @@
|
||||
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
|
||||
#if __IPHONE_OS_VERSION_MIN_REQUIRED < 80000
|
||||
@@ -242,7 +257,7 @@
|
||||
if ([actionSheet cancelButtonIndex] != buttonIndex){
|
||||
NSString * title = [actionSheet buttonTitleAtIndex:buttonIndex];
|
||||
if (![self.rowDescriptor.leftRightSelectorLeftOptionSelected isEqual:[self leftOptionForDescription:title].leftValue]){
|
||||
self.rowDescriptor.value = nil;
|
||||
self.rowDescriptor.value = [self chooseNewRightValueFromOption:[self leftOptionForDescription:title]];
|
||||
self.rowDescriptor.leftRightSelectorLeftOptionSelected = [self leftOptionForDescription:title].leftValue;
|
||||
[self.formViewController updateFormRow:self.rowDescriptor];
|
||||
}
|
||||
|
||||
@@ -87,7 +87,7 @@
|
||||
return tranformedValue;
|
||||
}
|
||||
}
|
||||
return [self.rowDescriptor.value displayText];
|
||||
return self.rowDescriptor.displayTextValue;
|
||||
}
|
||||
|
||||
|
||||
@@ -143,7 +143,7 @@
|
||||
self.editingAccessoryType = self.accessoryType;
|
||||
self.selectionStyle = self.rowDescriptor.isDisabled || [self.rowDescriptor.rowType isEqualToString:XLFormRowDescriptorTypeInfo] ? UITableViewCellSelectionStyleNone : UITableViewCellSelectionStyleDefault;
|
||||
self.textLabel.text = [NSString stringWithFormat:@"%@%@", self.rowDescriptor.title, self.rowDescriptor.required && self.rowDescriptor.sectionDescriptor.formDescriptor.addAsteriskToRequiredRowsTitle ? @"*" : @""];
|
||||
self.detailTextLabel.text = [self valueDisplayText];
|
||||
self.detailTextLabel.text = [self valueDisplayText];
|
||||
}
|
||||
|
||||
-(void)formDescriptorCellDidSelectedWithFormController:(XLFormViewController *)controller
|
||||
@@ -166,7 +166,7 @@
|
||||
UIViewController<XLFormRowDescriptorViewController> *selectorViewController = (UIViewController<XLFormRowDescriptorViewController> *)controllerToPresent;
|
||||
selectorViewController.rowDescriptor = self.rowDescriptor;
|
||||
selectorViewController.title = self.rowDescriptor.selectorTitle;
|
||||
|
||||
|
||||
if ([self.rowDescriptor.rowType isEqualToString:XLFormRowDescriptorTypeSelectorPopover]) {
|
||||
if (self.popoverController && self.popoverController.popoverVisible) {
|
||||
[self.popoverController dismissPopoverAnimated:NO];
|
||||
@@ -192,7 +192,7 @@
|
||||
XLFormOptionsViewController * optionsViewController = [[XLFormOptionsViewController alloc] initWithStyle:UITableViewStyleGrouped titleHeaderSection:nil titleFooterSection:nil];
|
||||
optionsViewController.rowDescriptor = self.rowDescriptor;
|
||||
optionsViewController.title = self.rowDescriptor.selectorTitle;
|
||||
|
||||
|
||||
if ([self.rowDescriptor.rowType isEqualToString:XLFormRowDescriptorTypeSelectorPopover]) {
|
||||
self.popoverController = [[UIPopoverController alloc] initWithContentViewController:optionsViewController];
|
||||
self.popoverController.delegate = self;
|
||||
@@ -212,10 +212,16 @@
|
||||
else if ([self.rowDescriptor.rowType isEqualToString:XLFormRowDescriptorTypeMultipleSelector] || [self.rowDescriptor.rowType isEqualToString:XLFormRowDescriptorTypeMultipleSelectorPopover])
|
||||
{
|
||||
NSAssert(self.rowDescriptor.selectorOptions, @"selectorOptions property shopuld not be nil");
|
||||
XLFormOptionsViewController * optionsViewController = [[XLFormOptionsViewController alloc] initWithStyle:UITableViewStyleGrouped titleHeaderSection:nil titleFooterSection:nil];
|
||||
UIViewController * controllerToPresent = nil;
|
||||
XLFormOptionsViewController * optionsViewController = nil;
|
||||
if ((controllerToPresent = [self controllerToPresent])){
|
||||
optionsViewController = (XLFormOptionsViewController *)controllerToPresent;
|
||||
} else {
|
||||
optionsViewController = [[XLFormOptionsViewController alloc] initWithStyle:UITableViewStyleGrouped titleHeaderSection:nil titleFooterSection:nil];
|
||||
}
|
||||
optionsViewController.rowDescriptor = self.rowDescriptor;
|
||||
optionsViewController.title = self.rowDescriptor.selectorTitle;
|
||||
|
||||
|
||||
if ([self.rowDescriptor.rowType isEqualToString:XLFormRowDescriptorTypeMultipleSelectorPopover]) {
|
||||
self.popoverController = [[UIPopoverController alloc] initWithContentViewController:optionsViewController];
|
||||
self.popoverController.delegate = self;
|
||||
@@ -232,8 +238,8 @@
|
||||
}
|
||||
}
|
||||
else if ([self.rowDescriptor.rowType isEqualToString:XLFormRowDescriptorTypeSelectorActionSheet]){
|
||||
|
||||
|
||||
|
||||
|
||||
#if __IPHONE_OS_VERSION_MAX_ALLOWED < 80000
|
||||
UIActionSheet * actionSheet = [[UIActionSheet alloc] initWithTitle:self.rowDescriptor.selectorTitle
|
||||
delegate:self
|
||||
@@ -260,7 +266,16 @@
|
||||
alertController.popoverPresentationController.sourceRect = [formViewController.tableView convertRect:v.frame fromView:self];
|
||||
__weak __typeof(self)weakSelf = self;
|
||||
for (id option in self.rowDescriptor.selectorOptions) {
|
||||
[alertController addAction:[UIAlertAction actionWithTitle:[option displayText]
|
||||
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];
|
||||
@@ -269,6 +284,7 @@
|
||||
}
|
||||
[formViewController presentViewController:alertController animated:YES completion:nil];
|
||||
}
|
||||
#ifndef XL_APP_EXTENSIONS
|
||||
else{
|
||||
UIActionSheet * actionSheet = [[UIActionSheet alloc] initWithTitle:self.rowDescriptor.selectorTitle
|
||||
delegate:self
|
||||
@@ -282,6 +298,7 @@
|
||||
actionSheet.tag = [self.rowDescriptor hash];
|
||||
[actionSheet showInView:controller.view];
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
[controller.tableView deselectRowAtIndexPath:[controller.form indexPathOfFormRow:self.rowDescriptor] animated:YES];
|
||||
}
|
||||
@@ -319,6 +336,7 @@
|
||||
[controller presentViewController:alertController animated:YES completion:nil];
|
||||
|
||||
}
|
||||
#ifndef XL_APP_EXTENSIONS
|
||||
else{
|
||||
UIAlertView * alertView = [[UIAlertView alloc] initWithTitle:self.rowDescriptor.selectorTitle
|
||||
message:nil
|
||||
@@ -332,6 +350,7 @@
|
||||
alertView.tag = [self.rowDescriptor hash];
|
||||
[alertView show];
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
[controller.tableView deselectRowAtIndexPath:[controller.form indexPathOfFormRow:self.rowDescriptor] animated:YES];
|
||||
}
|
||||
|
||||
@@ -40,7 +40,7 @@
|
||||
|
||||
#pragma mark - XLFormStepCounterCell
|
||||
|
||||
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
|
||||
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
|
||||
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
|
||||
if (self) {
|
||||
// Initialization code
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
#import <UIKit/UIKit.h>
|
||||
|
||||
extern NSString *const XLFormTextFieldLengthPercentage;
|
||||
extern NSString *const XLFormTextFieldMaxNumberOfCharacters;
|
||||
|
||||
@interface XLFormTextFieldCell : XLFormBaseCell <XLFormReturnKeyProtocol>
|
||||
|
||||
@@ -34,5 +35,6 @@ extern NSString *const XLFormTextFieldLengthPercentage;
|
||||
@property (nonatomic, readonly) UITextField * textField;
|
||||
|
||||
@property (nonatomic) NSNumber *textFieldLengthPercentage;
|
||||
@property (nonatomic) NSNumber *textFieldMaxNumberOfCharacters;
|
||||
|
||||
@end
|
||||
|
||||
@@ -30,6 +30,7 @@
|
||||
#import "XLFormTextFieldCell.h"
|
||||
|
||||
NSString *const XLFormTextFieldLengthPercentage = @"textFieldLengthPercentage";
|
||||
NSString *const XLFormTextFieldMaxNumberOfCharacters = @"textFieldMaxNumberOfCharacters";
|
||||
|
||||
@interface XLFormTextFieldCell() <UITextFieldDelegate>
|
||||
|
||||
@@ -94,12 +95,10 @@ NSString *const XLFormTextFieldLengthPercentage = @"textFieldLengthPercentage";
|
||||
if ([self.rowDescriptor.rowType isEqualToString:XLFormRowDescriptorTypeText]){
|
||||
self.textField.autocorrectionType = UITextAutocorrectionTypeDefault;
|
||||
self.textField.autocapitalizationType = UITextAutocapitalizationTypeSentences;
|
||||
self.textField.keyboardType = UIKeyboardTypeDefault;
|
||||
}
|
||||
else if ([self.rowDescriptor.rowType isEqualToString:XLFormRowDescriptorTypeName]){
|
||||
self.textField.autocorrectionType = UITextAutocorrectionTypeNo;
|
||||
self.textField.autocapitalizationType = UITextAutocapitalizationTypeWords;
|
||||
self.textField.keyboardType = UIKeyboardTypeDefault;
|
||||
}
|
||||
else if ([self.rowDescriptor.rowType isEqualToString:XLFormRowDescriptorTypeEmail]){
|
||||
self.textField.keyboardType = UIKeyboardTypeEmailAddress;
|
||||
@@ -149,7 +148,7 @@ NSString *const XLFormTextFieldLengthPercentage = @"textFieldLengthPercentage";
|
||||
|
||||
self.textLabel.text = ((self.rowDescriptor.required && self.rowDescriptor.title && self.rowDescriptor.sectionDescriptor.formDescriptor.addAsteriskToRequiredRowsTitle) ? [NSString stringWithFormat:@"%@*", self.rowDescriptor.title] : self.rowDescriptor.title);
|
||||
|
||||
self.textField.text = self.rowDescriptor.value ? [self.rowDescriptor.value displayText] : self.rowDescriptor.noValueDisplayText;
|
||||
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];
|
||||
@@ -202,8 +201,14 @@ NSString *const XLFormTextFieldLengthPercentage = @"textFieldLengthPercentage";
|
||||
[self.textLabel setContentCompressionResistancePriority:1000 forAxis:UILayoutConstraintAxisHorizontal];
|
||||
|
||||
// Add Constraints
|
||||
[result addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(>=11)-[_textField]-(>=11)-|" options:NSLayoutFormatAlignAllBaseline metrics:nil views:NSDictionaryOfVariableBindings(_textField)]];
|
||||
[result addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(>=11)-[_textLabel]-(>=11)-|" options:NSLayoutFormatAlignAllBaseline metrics:nil views:NSDictionaryOfVariableBindings(_textLabel)]];
|
||||
[result addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(margin)-[_textField]-(margin)-|"
|
||||
options:NSLayoutFormatAlignAllBaseline
|
||||
metrics:[NSDictionary dictionaryWithObjectsAndKeys:@(11.0), @"margin", nil]
|
||||
views:NSDictionaryOfVariableBindings(_textField)]];
|
||||
[result addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(margin)-[_textLabel]-(margin)-|"
|
||||
options:NSLayoutFormatAlignAllBaseline
|
||||
metrics:[NSDictionary dictionaryWithObjectsAndKeys:@(11.0), @"margin", nil]
|
||||
views:NSDictionaryOfVariableBindings(_textLabel)]];
|
||||
|
||||
return result;
|
||||
}
|
||||
@@ -213,10 +218,18 @@ NSString *const XLFormTextFieldLengthPercentage = @"textFieldLengthPercentage";
|
||||
if (self.dynamicCustomConstraints){
|
||||
[self.contentView removeConstraints:self.dynamicCustomConstraints];
|
||||
}
|
||||
NSDictionary * views = @{@"label": self.textLabel, @"textField": self.textField, @"image": self.imageView};
|
||||
NSMutableDictionary * views = [[NSMutableDictionary alloc] initWithDictionary: @{@"label": self.textLabel, @"textField": self.textField}];
|
||||
if (self.imageView.image){
|
||||
views[@"image"] = self.imageView;
|
||||
if (self.textLabel.text.length > 0){
|
||||
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
|
||||
toItem:self.contentView
|
||||
attribute:NSLayoutAttributeWidth
|
||||
multiplier:self.textFieldLengthPercentage ? [self.textFieldLengthPercentage floatValue] : 0.3
|
||||
constant:0.0]];
|
||||
}
|
||||
else{
|
||||
self.dynamicCustomConstraints = [NSMutableArray arrayWithArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:[image]-[textField]-|" options:0 metrics:nil views:views]];
|
||||
@@ -225,20 +238,19 @@ NSString *const XLFormTextFieldLengthPercentage = @"textFieldLengthPercentage";
|
||||
else{
|
||||
if (self.textLabel.text.length > 0){
|
||||
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
|
||||
toItem:self.contentView
|
||||
attribute:NSLayoutAttributeWidth
|
||||
multiplier:self.textFieldLengthPercentage ? [self.textFieldLengthPercentage floatValue] : 0.3
|
||||
constant:0.0]];
|
||||
}
|
||||
else{
|
||||
self.dynamicCustomConstraints = [NSMutableArray arrayWithArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[textField]-|" options:0 metrics:nil views:views]];
|
||||
}
|
||||
}
|
||||
|
||||
[self.dynamicCustomConstraints addObject:[NSLayoutConstraint constraintWithItem:_textField
|
||||
attribute:NSLayoutAttributeWidth
|
||||
relatedBy:self.textFieldLengthPercentage ? NSLayoutRelationEqual : NSLayoutRelationGreaterThanOrEqual
|
||||
toItem:self.contentView
|
||||
attribute:NSLayoutAttributeWidth
|
||||
multiplier:self.textFieldLengthPercentage ? [self.textFieldLengthPercentage floatValue] : 0.3
|
||||
constant:0.0]];
|
||||
|
||||
[self.contentView addConstraints:self.dynamicCustomConstraints];
|
||||
[super updateConstraints];
|
||||
}
|
||||
@@ -267,6 +279,15 @@ NSString *const XLFormTextFieldLengthPercentage = @"textFieldLengthPercentage";
|
||||
}
|
||||
|
||||
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
|
||||
if (self.textFieldMaxNumberOfCharacters) {
|
||||
// Check maximum length requirement
|
||||
NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string];
|
||||
if (newString.length > self.textFieldMaxNumberOfCharacters.integerValue) {
|
||||
return NO;
|
||||
}
|
||||
}
|
||||
|
||||
// Otherwise, leave response to view controller
|
||||
return [self.formViewController textField:textField shouldChangeCharactersInRange:range replacementString:string];
|
||||
}
|
||||
|
||||
@@ -274,11 +295,22 @@ NSString *const XLFormTextFieldLengthPercentage = @"textFieldLengthPercentage";
|
||||
{
|
||||
[self.formViewController beginEditing:self.rowDescriptor];
|
||||
[self.formViewController textFieldDidBeginEditing:textField];
|
||||
// set the input to the raw value if we have a formatter and it shouldn't be used during input
|
||||
if (self.rowDescriptor.valueFormatter) {
|
||||
self.textField.text = [self.rowDescriptor editTextValue];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)textFieldDidEndEditing:(UITextField *)textField
|
||||
{
|
||||
// process text change before we stick a formatted value in the UITextField
|
||||
[self textFieldDidChange:textField];
|
||||
|
||||
// losing input, replace the text field with the formatted value
|
||||
if (self.rowDescriptor.valueFormatter) {
|
||||
self.textField.text = [self.rowDescriptor.value displayText];
|
||||
}
|
||||
|
||||
[self.formViewController endEditing:self.rowDescriptor];
|
||||
[self.formViewController textFieldDidEndEditing:textField];
|
||||
}
|
||||
@@ -288,12 +320,33 @@ NSString *const XLFormTextFieldLengthPercentage = @"textFieldLengthPercentage";
|
||||
|
||||
- (void)textFieldDidChange:(UITextField *)textField{
|
||||
if([self.textField.text length] > 0) {
|
||||
if ([self.rowDescriptor.rowType isEqualToString:XLFormRowDescriptorTypeNumber] || [self.rowDescriptor.rowType isEqualToString:XLFormRowDescriptorTypeDecimal]){
|
||||
self.rowDescriptor.value = @([self.textField.text doubleValue]);
|
||||
} else if ([self.rowDescriptor.rowType isEqualToString:XLFormRowDescriptorTypeInteger]){
|
||||
self.rowDescriptor.value = @([self.textField.text integerValue]);
|
||||
} else {
|
||||
self.rowDescriptor.value = self.textField.text;
|
||||
BOOL didUseFormatter = NO;
|
||||
|
||||
if (self.rowDescriptor.valueFormatter && self.rowDescriptor.useValueFormatterDuringInput)
|
||||
{
|
||||
// use generic getObjectValue:forString:errorDescription and stringForObjectValue
|
||||
NSString *errorDescription = nil;
|
||||
NSString *objectValue = nil;
|
||||
|
||||
if ([ self.rowDescriptor.valueFormatter getObjectValue:&objectValue forString:textField.text errorDescription:&errorDescription]) {
|
||||
NSString *formattedValue = [self.rowDescriptor.valueFormatter stringForObjectValue:objectValue];
|
||||
|
||||
self.rowDescriptor.value = objectValue;
|
||||
textField.text = formattedValue;
|
||||
didUseFormatter = YES;
|
||||
}
|
||||
}
|
||||
|
||||
// only do this conversion if we didn't use the formatter
|
||||
if (!didUseFormatter)
|
||||
{
|
||||
if ([self.rowDescriptor.rowType isEqualToString:XLFormRowDescriptorTypeNumber] || [self.rowDescriptor.rowType isEqualToString:XLFormRowDescriptorTypeDecimal]){
|
||||
self.rowDescriptor.value = [NSDecimalNumber decimalNumberWithString:self.textField.text locale:NSLocale.currentLocale];
|
||||
} else if ([self.rowDescriptor.rowType isEqualToString:XLFormRowDescriptorTypeInteger]){
|
||||
self.rowDescriptor.value = @([self.textField.text integerValue]);
|
||||
} else {
|
||||
self.rowDescriptor.value = self.textField.text;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
self.rowDescriptor.value = nil;
|
||||
@@ -311,4 +364,5 @@ NSString *const XLFormTextFieldLengthPercentage = @"textFieldLengthPercentage";
|
||||
return _returnKeyType;
|
||||
}
|
||||
|
||||
|
||||
@end
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
#import <UIKit/UIKit.h>
|
||||
|
||||
extern NSString *const XLFormTextViewLengthPercentage;
|
||||
extern NSString *const XLFormTextViewMaxNumberOfCharacters;
|
||||
|
||||
@interface XLFormTextViewCell : XLFormBaseCell
|
||||
|
||||
@@ -36,5 +37,6 @@ extern NSString *const XLFormTextViewLengthPercentage;
|
||||
@property (nonatomic, readonly) XLFormTextView * textView;
|
||||
|
||||
@property (nonatomic) NSNumber *textViewLengthPercentage;
|
||||
@property (nonatomic) NSNumber *textViewMaxNumberOfCharacters;
|
||||
|
||||
@end
|
||||
|
||||
@@ -29,8 +29,8 @@
|
||||
#import "XLFormTextView.h"
|
||||
#import "XLFormTextViewCell.h"
|
||||
|
||||
NSString *const kFormTextViewCellPlaceholder = @"placeholder";
|
||||
NSString *const XLFormTextViewLengthPercentage = @"textViewLengthPercentage";
|
||||
NSString *const XLFormTextViewMaxNumberOfCharacters = @"textViewMaxNumberOfCharacters";
|
||||
|
||||
@interface XLFormTextViewCell() <UITextViewDelegate>
|
||||
|
||||
@@ -206,4 +206,17 @@ NSString *const XLFormTextViewLengthPercentage = @"textViewLengthPercentage";
|
||||
}
|
||||
}
|
||||
|
||||
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
|
||||
if (self.textViewMaxNumberOfCharacters) {
|
||||
// Check maximum length requirement
|
||||
NSString *newText = [textView.text stringByReplacingCharactersInRange:range withString:text];
|
||||
if (newText.length > self.textViewMaxNumberOfCharacters.integerValue) {
|
||||
return NO;
|
||||
}
|
||||
}
|
||||
|
||||
// Otherwise, leave response to view controller
|
||||
return [self.formViewController textView:textView shouldChangeTextInRange:range replacementText:text];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
return [[XLFormOptionsObject alloc] initWithValue:value displayText:displayText];
|
||||
}
|
||||
|
||||
-(id)initWithValue:(id)value displayText:(NSString *)displayText
|
||||
-(instancetype)initWithValue:(id)value displayText:(NSString *)displayText
|
||||
{
|
||||
self = [super init];
|
||||
if (self){
|
||||
@@ -94,7 +94,7 @@
|
||||
[encoder encodeObject:self.formDisplayText
|
||||
forKey:@"formDisplayText"];
|
||||
}
|
||||
-(id)initWithCoder:(NSCoder *)decoder
|
||||
-(instancetype)initWithCoder:(NSCoder *)decoder
|
||||
{
|
||||
if ((self=[super init])) {
|
||||
|
||||
|
||||
@@ -30,10 +30,10 @@
|
||||
|
||||
@interface XLFormOptionsViewController : UITableViewController<XLFormRowDescriptorViewController, XLFormRowDescriptorPopoverViewController>
|
||||
|
||||
- (id)initWithStyle:(UITableViewStyle)style;
|
||||
- (instancetype)initWithStyle:(UITableViewStyle)style;
|
||||
|
||||
|
||||
- (id)initWithStyle:(UITableViewStyle)style
|
||||
- (instancetype)initWithStyle:(UITableViewStyle)style
|
||||
titleHeaderSection:(NSString *)titleHeaderSection
|
||||
titleFooterSection:(NSString *)titleFooterSection;
|
||||
|
||||
|
||||
@@ -47,7 +47,7 @@
|
||||
@synthesize rowDescriptor = _rowDescriptor;
|
||||
@synthesize popoverController = __popoverController;
|
||||
|
||||
- (id)initWithStyle:(UITableViewStyle)style
|
||||
- (instancetype)initWithStyle:(UITableViewStyle)style
|
||||
{
|
||||
self = [super initWithStyle:style];
|
||||
if (self){
|
||||
@@ -57,7 +57,7 @@
|
||||
return self;
|
||||
}
|
||||
|
||||
- (id)initWithStyle:(UITableViewStyle)style titleHeaderSection:(NSString *)titleHeaderSection titleFooterSection:(NSString *)titleFooterSection
|
||||
- (instancetype)initWithStyle:(UITableViewStyle)style titleHeaderSection:(NSString *)titleHeaderSection titleFooterSection:(NSString *)titleFooterSection
|
||||
{
|
||||
self = [self initWithStyle:style];
|
||||
if (self){
|
||||
@@ -86,6 +86,11 @@
|
||||
{
|
||||
XLFormRightDetailCell * cell = [tableView dequeueReusableCellWithIdentifier:CELL_REUSE_IDENTIFIER forIndexPath:indexPath];
|
||||
id cellObject = [[self selectorOptions] objectAtIndex:indexPath.row];
|
||||
|
||||
[self.rowDescriptor.cellConfigForSelector enumerateKeysAndObjectsUsingBlock:^(NSString *keyPath, id value, __unused BOOL *stop) {
|
||||
[cell setValue:(value == [NSNull null]) ? nil : value forKeyPath:keyPath];
|
||||
}];
|
||||
|
||||
cell.textLabel.text = [self valueDisplayTextForOption:cellObject];
|
||||
if ([self.rowDescriptor.rowType isEqualToString:XLFormRowDescriptorTypeMultipleSelector] || [self.rowDescriptor.rowType isEqualToString:XLFormRowDescriptorTypeMultipleSelectorPopover]){
|
||||
cell.accessoryType = ([self selectedValuesContainsOption:cellObject] ? UITableViewCellAccessoryCheckmark : UITableViewCellAccessoryNone);
|
||||
@@ -133,8 +138,8 @@
|
||||
if ([[self.rowDescriptor.value valueData] isEqual:[cellObject valueData]]){
|
||||
if (!self.rowDescriptor.required){
|
||||
self.rowDescriptor.value = nil;
|
||||
cell.accessoryType = UITableViewCellAccessoryNone;
|
||||
}
|
||||
cell.accessoryType = UITableViewCellAccessoryNone;
|
||||
}
|
||||
else{
|
||||
if (self.rowDescriptor.value){
|
||||
|
||||
@@ -83,8 +83,10 @@ typedef NS_ENUM(NSUInteger, XLFormRowNavigationDirection) {
|
||||
@property XLFormDescriptor * form;
|
||||
@property IBOutlet UITableView * tableView;
|
||||
|
||||
-(id)initWithForm:(XLFormDescriptor *)form;
|
||||
-(id)initWithForm:(XLFormDescriptor *)form style:(UITableViewStyle)style;
|
||||
-(instancetype)initWithForm:(XLFormDescriptor *)form;
|
||||
-(instancetype)initWithForm:(XLFormDescriptor *)form style:(UITableViewStyle)style;
|
||||
-(instancetype)initWithCoder:(NSCoder *)aDecoder NS_DESIGNATED_INITIALIZER;
|
||||
-(instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil NS_DESIGNATED_INITIALIZER;
|
||||
+(NSMutableDictionary *)cellClassesForRowDescriptorTypes;
|
||||
+(NSMutableDictionary *)inlineRowDescriptorTypesForRowDescriptorTypes;
|
||||
|
||||
|
||||
@@ -68,12 +68,12 @@
|
||||
|
||||
#pragma mark - Initialization
|
||||
|
||||
-(id)initWithForm:(XLFormDescriptor *)form
|
||||
-(instancetype)initWithForm:(XLFormDescriptor *)form
|
||||
{
|
||||
return [self initWithForm:form style:UITableViewStyleGrouped];
|
||||
}
|
||||
|
||||
-(id)initWithForm:(XLFormDescriptor *)form style:(UITableViewStyle)style
|
||||
-(instancetype)initWithForm:(XLFormDescriptor *)form style:(UITableViewStyle)style
|
||||
{
|
||||
self = [self initWithNibName:nil bundle:nil];
|
||||
if (self){
|
||||
@@ -83,30 +83,27 @@
|
||||
return self;
|
||||
}
|
||||
|
||||
-(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
|
||||
-(instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
|
||||
{
|
||||
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
|
||||
if (self){
|
||||
[self defaultInitialize];
|
||||
_form = nil;
|
||||
_tableViewStyle = UITableViewStyleGrouped;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
-(id)initWithCoder:(NSCoder *)aDecoder
|
||||
-(instancetype)initWithCoder:(NSCoder *)aDecoder
|
||||
{
|
||||
self = [super initWithCoder:aDecoder];
|
||||
if (self){
|
||||
[self defaultInitialize];
|
||||
if (self) {
|
||||
_form = nil;
|
||||
_tableViewStyle = UITableViewStyleGrouped;
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
-(void)defaultInitialize
|
||||
{
|
||||
_form = nil;
|
||||
_tableViewStyle = UITableViewStyleGrouped;
|
||||
}
|
||||
|
||||
- (void)dealloc
|
||||
{
|
||||
self.tableView.delegate = nil;
|
||||
@@ -482,6 +479,7 @@
|
||||
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
|
||||
@@ -491,6 +489,7 @@
|
||||
[alertView show];
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
|
||||
-(void)performFormSelector:(SEL)selector withObject:(id)sender
|
||||
@@ -615,15 +614,10 @@
|
||||
|
||||
|
||||
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
|
||||
{
|
||||
XLFormRowDescriptor * rowDescriptor = [self.form formRowAtIndex:indexPath];
|
||||
return [rowDescriptor cellForFormController:self];
|
||||
}
|
||||
|
||||
-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
|
||||
{
|
||||
XLFormRowDescriptor * rowDescriptor = [self.form formRowAtIndex:indexPath];
|
||||
[self updateFormRow:rowDescriptor];
|
||||
return [rowDescriptor cellForFormController:self];
|
||||
}
|
||||
|
||||
|
||||
@@ -730,9 +724,10 @@
|
||||
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
|
||||
{
|
||||
XLFormRowDescriptor *rowDescriptor = [self.form formRowAtIndex:indexPath];
|
||||
Class cellClass = [[rowDescriptor cellForFormController:self] class];
|
||||
if ([cellClass respondsToSelector:@selector(formDescriptorCellHeightForRowDescriptor:)]){
|
||||
return [cellClass formDescriptorCellHeightForRowDescriptor:rowDescriptor];
|
||||
[rowDescriptor cellForFormController:self];
|
||||
CGFloat height = rowDescriptor.height;
|
||||
if (height != XLFormUnspecifiedCellHeight){
|
||||
return height;
|
||||
}
|
||||
return self.tableView.rowHeight;
|
||||
}
|
||||
@@ -740,9 +735,10 @@
|
||||
-(CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath
|
||||
{
|
||||
XLFormRowDescriptor *rowDescriptor = [self.form formRowAtIndex:indexPath];
|
||||
Class cellClass = [[rowDescriptor cellForFormController:self] class];
|
||||
if ([cellClass respondsToSelector:@selector(formDescriptorCellHeightForRowDescriptor:)]){
|
||||
return [cellClass formDescriptorCellHeightForRowDescriptor:rowDescriptor];
|
||||
[rowDescriptor cellForFormController:self];
|
||||
CGFloat height = rowDescriptor.height;
|
||||
if (height != XLFormUnspecifiedCellHeight){
|
||||
return height;
|
||||
}
|
||||
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0")){
|
||||
return self.tableView.estimatedRowHeight;
|
||||
@@ -908,6 +904,10 @@
|
||||
{
|
||||
}
|
||||
|
||||
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
|
||||
return YES;
|
||||
}
|
||||
|
||||
#pragma mark - UIScrollViewDelegate
|
||||
|
||||
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
|
||||
|
||||
@@ -29,6 +29,8 @@
|
||||
#import "XLFormValidatorProtocol.h"
|
||||
#import "XLFormValidationStatus.h"
|
||||
|
||||
extern CGFloat XLFormUnspecifiedCellHeight;
|
||||
|
||||
@class XLFormViewController;
|
||||
@class XLFormSectionDescriptor;
|
||||
@protocol XLFormValidatorProtocol;
|
||||
@@ -52,10 +54,20 @@ typedef void(^XLOnChangeBlock)(id __nullable oldValue,id __nullable newValue,XLF
|
||||
@property (nonatomic, nullable) id value;
|
||||
@property (nullable) Class valueTransformer;
|
||||
@property UITableViewCellStyle cellStyle;
|
||||
@property (nonatomic) CGFloat height;
|
||||
|
||||
@property (copy, nullable) XLOnChangeBlock onChangeBlock;
|
||||
@property BOOL useValueFormatterDuringInput;
|
||||
@property (nullable) NSFormatter *valueFormatter;
|
||||
|
||||
// returns the display text for the row descriptor, taking into account NSFormatters and default placeholder values
|
||||
- (nonnull NSString *) displayTextValue;
|
||||
|
||||
// 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;
|
||||
|
||||
@@ -78,7 +90,7 @@ typedef void(^XLOnChangeBlock)(id __nullable oldValue,id __nullable newValue,XLF
|
||||
@property (nullable) NSString *requireMsg;
|
||||
-(void)addValidator:(nonnull id<XLFormValidatorProtocol>)validator;
|
||||
-(void)removeValidator:(nonnull id<XLFormValidatorProtocol>)validator;
|
||||
-(nonnull XLFormValidationStatus *)doValidation;
|
||||
-(nullable XLFormValidationStatus *)doValidation;
|
||||
|
||||
// ===========================
|
||||
// property used for Selectors
|
||||
@@ -100,12 +112,20 @@ typedef void(^XLOnChangeBlock)(id __nullable oldValue,id __nullable newValue,XLF
|
||||
|
||||
@end
|
||||
|
||||
typedef NS_ENUM(NSUInteger, XLFormLeftRightSelectorOptionLeftValueChangePolicy)
|
||||
{
|
||||
XLFormLeftRightSelectorOptionLeftValueChangePolicyNullifyRightValue = 0,
|
||||
XLFormLeftRightSelectorOptionLeftValueChangePolicyChooseFirstOption,
|
||||
XLFormLeftRightSelectorOptionLeftValueChangePolicyChooseLastOption
|
||||
};
|
||||
|
||||
|
||||
// =====================================
|
||||
// helper object used for LEFTRIGHTSelector Descriptor
|
||||
// =====================================
|
||||
@interface XLFormLeftRightSelectorOption : NSObject
|
||||
|
||||
@property (nonatomic, assign) XLFormLeftRightSelectorOptionLeftValueChangePolicy leftValueChangePolicy;
|
||||
@property (readonly, nonnull) id leftValue;
|
||||
@property (readonly, nonnull) NSArray * rightOptions;
|
||||
@property (readonly, null_unspecified) NSString * httpParameterKey;
|
||||
|
||||
@@ -28,6 +28,9 @@
|
||||
#import "XLFormRowDescriptor.h"
|
||||
#import "NSString+XLFormAdditions.h"
|
||||
|
||||
CGFloat XLFormUnspecifiedCellHeight = -3.0;
|
||||
CGFloat XLFormRowInitialHeight = -2;
|
||||
|
||||
@interface XLFormDescriptor (_XLFormRowDescriptor)
|
||||
|
||||
@property (readonly) NSDictionary* allRowsByTag;
|
||||
@@ -44,6 +47,8 @@
|
||||
|
||||
@end
|
||||
|
||||
#import "NSObject+XLFormAdditions.h"
|
||||
|
||||
@interface XLFormRowDescriptor() <NSCopying>
|
||||
|
||||
@property XLFormBaseCell * cell;
|
||||
@@ -64,8 +69,10 @@
|
||||
@synthesize hidePredicateCache = _hidePredicateCache;
|
||||
@synthesize disablePredicateCache = _disablePredicateCache;
|
||||
@synthesize cellConfig = _cellConfig;
|
||||
@synthesize cellConfigForSelector = _cellConfigForSelector;
|
||||
@synthesize cellConfigIfDisabled = _cellConfigIfDisabled;
|
||||
@synthesize cellConfigAtConfigure = _cellConfigAtConfigure;
|
||||
@synthesize height = _height;
|
||||
|
||||
-(instancetype)init
|
||||
{
|
||||
@@ -91,6 +98,7 @@
|
||||
_disablePredicateCache = nil;
|
||||
_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];
|
||||
@@ -158,6 +166,14 @@
|
||||
return _cellConfig;
|
||||
}
|
||||
|
||||
-(NSMutableDictionary *)cellConfigForSelector
|
||||
{
|
||||
if (_cellConfigForSelector) return _cellConfigForSelector;
|
||||
_cellConfigForSelector = [NSMutableDictionary dictionary];
|
||||
return _cellConfigForSelector;
|
||||
}
|
||||
|
||||
|
||||
-(NSMutableDictionary *)cellConfigIfDisabled
|
||||
{
|
||||
if (_cellConfigIfDisabled) return _cellConfigIfDisabled;
|
||||
@@ -172,6 +188,41 @@
|
||||
return _cellConfigAtConfigure;
|
||||
}
|
||||
|
||||
-(NSString*)editTextValue
|
||||
{
|
||||
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];
|
||||
}
|
||||
}else{
|
||||
// have value, but no formatter, use the value's displayText
|
||||
return [self.value displayText];
|
||||
}
|
||||
}else{
|
||||
// placeholder
|
||||
return @"";
|
||||
}
|
||||
}
|
||||
|
||||
-(NSString*)displayTextValue
|
||||
{
|
||||
if (self.value) {
|
||||
if (self.valueFormatter) {
|
||||
return [self.valueFormatter stringForObjectValue:self.value];
|
||||
}
|
||||
else{
|
||||
return [self.value displayText];
|
||||
}
|
||||
}
|
||||
else {
|
||||
return self.noValueDisplayText;
|
||||
}
|
||||
}
|
||||
|
||||
-(NSString *)description
|
||||
{
|
||||
return self.tag; // [NSString stringWithFormat:@"%@ - %@ (%@)", [super description], self.tag, self.rowType];
|
||||
@@ -190,6 +241,22 @@
|
||||
_action = action;
|
||||
}
|
||||
|
||||
-(CGFloat)height
|
||||
{
|
||||
if (_height == XLFormRowInitialHeight){
|
||||
if ([[self.cell class] respondsToSelector:@selector(formDescriptorCellHeightForRowDescriptor:)]){
|
||||
return [[self.cell class] formDescriptorCellHeightForRowDescriptor:self];
|
||||
} else {
|
||||
_height = XLFormUnspecifiedCellHeight;
|
||||
}
|
||||
}
|
||||
return _height;
|
||||
}
|
||||
|
||||
-(void)setHeight:(CGFloat)height {
|
||||
_height = height;
|
||||
}
|
||||
|
||||
// In the implementation
|
||||
-(id)copyWithZone:(NSZone *)zone
|
||||
{
|
||||
@@ -203,6 +270,7 @@
|
||||
rowDescriptorCopy.required = self.isRequired;
|
||||
rowDescriptorCopy.isDirtyDisablePredicateCache = YES;
|
||||
rowDescriptorCopy.isDirtyHidePredicateCache = YES;
|
||||
rowDescriptorCopy.validators = [self.validators mutableCopy];
|
||||
|
||||
// =====================
|
||||
// properties for Button
|
||||
@@ -426,7 +494,8 @@
|
||||
|
||||
- (BOOL)valueIsEmpty
|
||||
{
|
||||
return self.value == nil || [self.value isKindOfClass:[NSNull class]] || ([self.value respondsToSelector:@selector(length)] && [self.value length]==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
|
||||
@@ -520,7 +589,7 @@
|
||||
}
|
||||
|
||||
|
||||
-(id)initWithLeftValue:(NSString *)leftValue httpParameterKey:(NSString *)httpParameterKey rightOptions:(NSArray *)rightOptions
|
||||
-(instancetype)initWithLeftValue:(NSString *)leftValue httpParameterKey:(NSString *)httpParameterKey rightOptions:(NSArray *)rightOptions
|
||||
{
|
||||
self = [super init];
|
||||
if (self){
|
||||
|
||||
@@ -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:(NSIndexPath *)sourceIndex toIndexPath:(NSIndexPath *)destinationIndex;
|
||||
|
||||
@end
|
||||
|
||||
@@ -31,12 +31,12 @@
|
||||
|
||||
-(NSString *)displayText
|
||||
{
|
||||
if ([self isKindOfClass:[NSString class]] || [self isKindOfClass:[NSNumber class]]){
|
||||
return [self description];
|
||||
}
|
||||
if ([self conformsToProtocol:@protocol(XLFormOptionObject)]){
|
||||
return [(id<XLFormOptionObject>)self formDisplayText];
|
||||
}
|
||||
if ([self isKindOfClass:[NSString class]] || [self isKindOfClass:[NSNumber class]]){
|
||||
return [self description];
|
||||
}
|
||||
return nil;
|
||||
}
|
||||
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
|
||||
@implementation XLFormRightDetailCell
|
||||
|
||||
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
|
||||
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
|
||||
{
|
||||
return [super initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:reuseIdentifier];
|
||||
}
|
||||
|
||||
@@ -40,7 +40,7 @@
|
||||
@synthesize doneButton = _doneButton;
|
||||
|
||||
|
||||
- (id)initWithFrame:(CGRect)frame
|
||||
- (instancetype)initWithFrame:(CGRect)frame
|
||||
{
|
||||
self = [super initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, 44.0)];
|
||||
if (self) {
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
[[NSNotificationCenter defaultCenter] removeObserver:self];
|
||||
}
|
||||
|
||||
- (id)initWithFrame:(CGRect)frame
|
||||
- (instancetype)initWithFrame:(CGRect)frame
|
||||
{
|
||||
if((self = [super initWithFrame:frame])){
|
||||
self.scrollsToTop = NO;
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
@property NSString *msg;
|
||||
@property NSString *regex;
|
||||
|
||||
- (id)initWithMsg:(NSString*)msg andRegexString:(NSString*)regex;
|
||||
- (instancetype)initWithMsg:(NSString*)msg andRegexString:(NSString*)regex;
|
||||
+ (XLFormRegexValidator *)formRegexValidatorWithMsg:(NSString *)msg regex:(NSString *)regex;
|
||||
|
||||
@end
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
|
||||
@implementation XLFormRegexValidator
|
||||
|
||||
-(id)initWithMsg:(NSString*)msg andRegexString:(NSString*)regex {
|
||||
-(instancetype)initWithMsg:(NSString*)msg andRegexString:(NSString*)regex {
|
||||
self = [super init];
|
||||
if (self) {
|
||||
self.msg = msg;
|
||||
|
||||
@@ -33,8 +33,8 @@
|
||||
@property BOOL isValid;
|
||||
@property (nonatomic, weak) XLFormRowDescriptor *rowDescriptor;
|
||||
|
||||
//-(id)initWithMsg:(NSString*)msg andStatus:(BOOL)isValid;
|
||||
-(id)initWithMsg:(NSString*)msg status:(BOOL)isValid rowDescriptor:(XLFormRowDescriptor *)row;
|
||||
//-(instancetype)initWithMsg:(NSString*)msg andStatus:(BOOL)isValid;
|
||||
-(instancetype)initWithMsg:(NSString*)msg status:(BOOL)isValid rowDescriptor:(XLFormRowDescriptor *)row;
|
||||
|
||||
//+(XLFormValidationStatus *)formValidationStatusWithMsg:(NSString *)msg status:(BOOL)status;
|
||||
+(XLFormValidationStatus *)formValidationStatusWithMsg:(NSString *)msg status:(BOOL)status rowDescriptor:(XLFormRowDescriptor *)row;
|
||||
|
||||
@@ -27,11 +27,11 @@
|
||||
|
||||
@implementation XLFormValidationStatus
|
||||
|
||||
-(id)initWithMsg:(NSString*)msg andStatus:(BOOL)isValid {
|
||||
-(instancetype)initWithMsg:(NSString*)msg andStatus:(BOOL)isValid {
|
||||
return [self initWithMsg:msg status:isValid rowDescriptor:nil];
|
||||
}
|
||||
|
||||
-(id)initWithMsg:(NSString*)msg status:(BOOL)isValid rowDescriptor:(XLFormRowDescriptor *)row {
|
||||
-(instancetype)initWithMsg:(NSString*)msg status:(BOOL)isValid rowDescriptor:(XLFormRowDescriptor *)row {
|
||||
self = [super init];
|
||||
if (self) {
|
||||
self.msg = msg;
|
||||
|
||||
Reference in New Issue
Block a user