Skip to content

Commit

Permalink
Updated license (BSD) & readme, refactored picker related bindings (b…
Browse files Browse the repository at this point in the history
…reaking changes, work in progress, liveModelUpdates not working atm), work towards more modular bindings (in progress), support for segmented controls (and demo)
  • Loading branch information
mutech committed Nov 30, 2015
1 parent 7795dea commit 0411870
Show file tree
Hide file tree
Showing 27 changed files with 1,131 additions and 737 deletions.
2 changes: 1 addition & 1 deletion AKABeacon.podspec
@@ -1,7 +1,7 @@
Pod::Spec.new do |spec|
spec.name = 'AKABeacon'
spec.version = '0.1.0-pre.2'
spec.license = 'GPL-v3'
spec.license = 'BSD'
spec.homepage = 'https://github.com/mutech/aka-ios-beacon/'
spec.authors = { 'Michael Utech' => 'michael.utech@aka-labs.com' }
spec.summary = 'The missing binding framework for iOS'
Expand Down
32 changes: 16 additions & 16 deletions AKABeacon/AKABeacon.xcodeproj/project.pbxproj
Expand Up @@ -36,11 +36,11 @@
8E367A0A1BBA8B4C0094EF33 /* UILabel+AKAIBBindingProperties.m in Sources */ = {isa = PBXBuildFile; fileRef = 8E367A081BBA8B4C0094EF33 /* UILabel+AKAIBBindingProperties.m */; };
8E367A121BBADFF70094EF33 /* UISwitch+AKAIBBindingProperties.h in Headers */ = {isa = PBXBuildFile; fileRef = 8E367A101BBADFF70094EF33 /* UISwitch+AKAIBBindingProperties.h */; settings = {ATTRIBUTES = (Public, ); }; };
8E367A131BBADFF70094EF33 /* UISwitch+AKAIBBindingProperties.m in Sources */ = {isa = PBXBuildFile; fileRef = 8E367A111BBADFF70094EF33 /* UISwitch+AKAIBBindingProperties.m */; };
8E3F6AAA1C03D68B00757ABF /* AKAViewBinding+IBPropertySupport.h in Headers */ = {isa = PBXBuildFile; fileRef = 8E3F6AA81C03D68B00757ABF /* AKAViewBinding+IBPropertySupport.h */; };
8E3F6AAA1C03D68B00757ABF /* AKAViewBinding+IBPropertySupport.h in Headers */ = {isa = PBXBuildFile; fileRef = 8E3F6AA81C03D68B00757ABF /* AKAViewBinding+IBPropertySupport.h */; settings = {ATTRIBUTES = (Public, ); }; };
8E3F6AAB1C03D68B00757ABF /* AKAViewBinding+IBPropertySupport.m in Sources */ = {isa = PBXBuildFile; fileRef = 8E3F6AA91C03D68B00757ABF /* AKAViewBinding+IBPropertySupport.m */; };
8E3F6AAF1C040F2300757ABF /* UIPickerView+AKAIBBindingProperties.h in Headers */ = {isa = PBXBuildFile; fileRef = 8E3F6AAD1C040F2300757ABF /* UIPickerView+AKAIBBindingProperties.h */; };
8E3F6AAF1C040F2300757ABF /* UIPickerView+AKAIBBindingProperties.h in Headers */ = {isa = PBXBuildFile; fileRef = 8E3F6AAD1C040F2300757ABF /* UIPickerView+AKAIBBindingProperties.h */; settings = {ATTRIBUTES = (Public, ); }; };
8E3F6AB01C040F2300757ABF /* UIPickerView+AKAIBBindingProperties.m in Sources */ = {isa = PBXBuildFile; fileRef = 8E3F6AAE1C040F2300757ABF /* UIPickerView+AKAIBBindingProperties.m */; };
8E3F6AB31C040F5D00757ABF /* AKABinding_UIPickerView_valueBinding.h in Headers */ = {isa = PBXBuildFile; fileRef = 8E3F6AB11C040F5D00757ABF /* AKABinding_UIPickerView_valueBinding.h */; };
8E3F6AB31C040F5D00757ABF /* AKABinding_UIPickerView_valueBinding.h in Headers */ = {isa = PBXBuildFile; fileRef = 8E3F6AB11C040F5D00757ABF /* AKABinding_UIPickerView_valueBinding.h */; settings = {ATTRIBUTES = (Public, ); }; };
8E3F6AB41C040F5D00757ABF /* AKABinding_UIPickerView_valueBinding.m in Sources */ = {isa = PBXBuildFile; fileRef = 8E3F6AB21C040F5D00757ABF /* AKABinding_UIPickerView_valueBinding.m */; };
8E46D4001BEB7394002E497B /* AKABeaconTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 8E46D3FF1BEB7394002E497B /* AKABeaconTests.m */; };
8E46D4021BEB7394002E497B /* AKABeacon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8E7232F01B00224400D647A9 /* AKABeacon.framework */; };
Expand Down Expand Up @@ -138,8 +138,8 @@
8E8922FE1BD2F49200BCEE88 /* AKAKeyboardBinding_AKACustomKeyboardResponderView.m in Sources */ = {isa = PBXBuildFile; fileRef = 8E8922FC1BD2F49200BCEE88 /* AKAKeyboardBinding_AKACustomKeyboardResponderView.m */; };
8E979A4B1B9FE6B100E0D29C /* AKABooleanTextConverter.h in Headers */ = {isa = PBXBuildFile; fileRef = 8E979A491B9FE6B100E0D29C /* AKABooleanTextConverter.h */; settings = {ATTRIBUTES = (Public, ); }; };
8E979A4C1B9FE6B100E0D29C /* AKABooleanTextConverter.m in Sources */ = {isa = PBXBuildFile; fileRef = 8E979A4A1B9FE6B100E0D29C /* AKABooleanTextConverter.m */; };
8E99A3E31BFFC57F00595895 /* AKABinding_UISegmentedControl_selectionBinding.h in Headers */ = {isa = PBXBuildFile; fileRef = 8E99A3E11BFFC57F00595895 /* AKABinding_UISegmentedControl_selectionBinding.h */; settings = {ATTRIBUTES = (Public, ); }; };
8E99A3E41BFFC57F00595895 /* AKABinding_UISegmentedControl_selectionBinding.m in Sources */ = {isa = PBXBuildFile; fileRef = 8E99A3E21BFFC57F00595895 /* AKABinding_UISegmentedControl_selectionBinding.m */; };
8E99A3E31BFFC57F00595895 /* AKABinding_UISegmentedControl_valueBinding.h in Headers */ = {isa = PBXBuildFile; fileRef = 8E99A3E11BFFC57F00595895 /* AKABinding_UISegmentedControl_valueBinding.h */; settings = {ATTRIBUTES = (Public, ); }; };
8E99A3E41BFFC57F00595895 /* AKABinding_UISegmentedControl_valueBinding.m in Sources */ = {isa = PBXBuildFile; fileRef = 8E99A3E21BFFC57F00595895 /* AKABinding_UISegmentedControl_valueBinding.m */; };
8E99A3E71BFFC59500595895 /* AKASelectionControlViewBinding.h in Headers */ = {isa = PBXBuildFile; fileRef = 8E99A3E51BFFC59500595895 /* AKASelectionControlViewBinding.h */; settings = {ATTRIBUTES = (Public, ); }; };
8E99A3E81BFFC59500595895 /* AKASelectionControlViewBinding.m in Sources */ = {isa = PBXBuildFile; fileRef = 8E99A3E61BFFC59500595895 /* AKASelectionControlViewBinding.m */; };
8E99A3F01C0164D400595895 /* UITextViewBindingsSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E99A3EF1C0164D400595895 /* UITextViewBindingsSpec.swift */; };
Expand Down Expand Up @@ -356,8 +356,8 @@
8E8922FC1BD2F49200BCEE88 /* AKAKeyboardBinding_AKACustomKeyboardResponderView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AKAKeyboardBinding_AKACustomKeyboardResponderView.m; sourceTree = "<group>"; };
8E979A491B9FE6B100E0D29C /* AKABooleanTextConverter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AKABooleanTextConverter.h; sourceTree = "<group>"; };
8E979A4A1B9FE6B100E0D29C /* AKABooleanTextConverter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AKABooleanTextConverter.m; sourceTree = "<group>"; };
8E99A3E11BFFC57F00595895 /* AKABinding_UISegmentedControl_selectionBinding.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AKABinding_UISegmentedControl_selectionBinding.h; sourceTree = "<group>"; };
8E99A3E21BFFC57F00595895 /* AKABinding_UISegmentedControl_selectionBinding.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AKABinding_UISegmentedControl_selectionBinding.m; sourceTree = "<group>"; };
8E99A3E11BFFC57F00595895 /* AKABinding_UISegmentedControl_valueBinding.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AKABinding_UISegmentedControl_valueBinding.h; sourceTree = "<group>"; };
8E99A3E21BFFC57F00595895 /* AKABinding_UISegmentedControl_valueBinding.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AKABinding_UISegmentedControl_valueBinding.m; sourceTree = "<group>"; };
8E99A3E51BFFC59500595895 /* AKASelectionControlViewBinding.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AKASelectionControlViewBinding.h; sourceTree = "<group>"; };
8E99A3E61BFFC59500595895 /* AKASelectionControlViewBinding.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AKASelectionControlViewBinding.m; sourceTree = "<group>"; };
8E99A3EF1C0164D400595895 /* UITextViewBindingsSpec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UITextViewBindingsSpec.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -459,8 +459,8 @@
8E225FE71BAEB41300BC070F /* UIView+AKABindingSupport.h */,
8E225FE81BAEB41300BC070F /* UIView+AKABindingSupport.m */,
8EA9AB3F1BABFA8C0070F13E /* Specification */,
8E482C7A1BC2D97C00FF7484 /* ViewBindings */,
8E482C791BC2D97300FF7484 /* PropertyBindings */,
8E482C7A1BC2D97C00FF7484 /* ViewBindings */,
);
name = Bindings;
path = Classes;
Expand Down Expand Up @@ -641,8 +641,8 @@
children = (
8E646DF31BFF7EE10023C0B9 /* UISegmentedControl+IBBindingProperties.h */,
8E646DF41BFF7EE10023C0B9 /* UISegmentedControl+IBBindingProperties.m */,
8E99A3E11BFFC57F00595895 /* AKABinding_UISegmentedControl_selectionBinding.h */,
8E99A3E21BFFC57F00595895 /* AKABinding_UISegmentedControl_selectionBinding.m */,
8E99A3E11BFFC57F00595895 /* AKABinding_UISegmentedControl_valueBinding.h */,
8E99A3E21BFFC57F00595895 /* AKABinding_UISegmentedControl_valueBinding.m */,
);
name = UISegmentedControl;
sourceTree = "<group>";
Expand Down Expand Up @@ -806,11 +806,11 @@
8EE26D431BCD15BF003ACCEC /* AKAControlViewBinding.m */,
8E646DFB1BFF805B0023C0B9 /* AKASelectionControlViewBinding.h */,
8E646DFC1BFF805B0023C0B9 /* AKASelectionControlViewBinding.m */,
8E3F6AAC1C040EC900757ABF /* UIPickerView */,
8E646DF21BFF7CFE0023C0B9 /* UISegmentedControl */,
8E4F0A6C1BE3D888006D8876 /* UISilder */,
8E6B04D11BF0BC4700A2BCBE /* UIStepper */,
8E367A0F1BBADFC60094EF33 /* UISwitch */,
8E3F6AAC1C040EC900757ABF /* UIPickerView */,
8E8922F91BD2E8C700BCEE88 /* KeyboardControlViewBindings */,
8E593DC51BD507030040B391 /* ComplexControlViewBindings */,
8E99A3E51BFFC59500595895 /* AKASelectionControlViewBinding.h */,
Expand Down Expand Up @@ -969,8 +969,11 @@
isa = PBXHeadersBuildPhase;
buildActionMask = 2147483647;
files = (
8E3F6AAF1C040F2300757ABF /* UIPickerView+AKAIBBindingProperties.h in Headers */,
8E3F6AB31C040F5D00757ABF /* AKABinding_UIPickerView_valueBinding.h in Headers */,
8E3F6AAA1C03D68B00757ABF /* AKAViewBinding+IBPropertySupport.h in Headers */,
8E99A3E71BFFC59500595895 /* AKASelectionControlViewBinding.h in Headers */,
8E99A3E31BFFC57F00595895 /* AKABinding_UISegmentedControl_selectionBinding.h in Headers */,
8E99A3E31BFFC57F00595895 /* AKABinding_UISegmentedControl_valueBinding.h in Headers */,
8E646DF51BFF7EE10023C0B9 /* UISegmentedControl+IBBindingProperties.h in Headers */,
DA83A82B7647A536E7E97FA9 /* AKAControlValidationState.h in Headers */,
8E59DE5B1BF838BD003BBC8D /* AKABinding_UILabel_textBinding.h in Headers */,
Expand Down Expand Up @@ -1010,10 +1013,8 @@
8E7233741B0022A200D647A9 /* AKAControlViewProtocol.h in Headers */,
8E225FED1BAEB63400BC070F /* UITextField+AKAIBBindingProperties.h in Headers */,
8E84A4F61BCBBEF500C5488A /* AKAFormViewController.h in Headers */,
8E3F6AB31C040F5D00757ABF /* AKABinding_UIPickerView_valueBinding.h in Headers */,
8E7233731B0022A200D647A9 /* AKAControlValidatorProtocol.h in Headers */,
8E72336C1B0022A200D647A9 /* AKAControlConverterProtocol.h in Headers */,
8E3F6AAA1C03D68B00757ABF /* AKAViewBinding+IBPropertySupport.h in Headers */,
8E7233801B0022A200D647A9 /* AKAKeyboardActivationSequence.h in Headers */,
8E31545C1BC73291003FD085 /* UITextView+AKAIBBindingProperties.h in Headers */,
8E26A51C1BC18E1C003D133C /* AKABinding_AKABinding_numberFormatter.h in Headers */,
Expand Down Expand Up @@ -1067,7 +1068,6 @@
8E225FE91BAEB41300BC070F /* UIView+AKABindingSupport.h in Headers */,
8E225FE11BADEA5C00BC070F /* AKABindingExpression_Internal.h in Headers */,
8E7233701B0022A200D647A9 /* AKABeaconErrors_Internal.h in Headers */,
8E3F6AAF1C040F2300757ABF /* UIPickerView+AKAIBBindingProperties.h in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
};
Expand Down Expand Up @@ -1354,7 +1354,7 @@
8E3F6AB41C040F5D00757ABF /* AKABinding_UIPickerView_valueBinding.m in Sources */,
8E7233721B0022A200D647A9 /* AKABeaconStyleKit.m in Sources */,
8EE26D451BCD15BF003ACCEC /* AKAControlViewBinding.m in Sources */,
8E99A3E41BFFC57F00595895 /* AKABinding_UISegmentedControl_selectionBinding.m in Sources */,
8E99A3E41BFFC57F00595895 /* AKABinding_UISegmentedControl_valueBinding.m in Sources */,
8E72337F1B0022A200D647A9 /* AKAFormTableViewController.m in Sources */,
8E7233691B0022A200D647A9 /* AKAControl.m in Sources */,
8E482C781BC2D96400FF7484 /* AKAPropertyBinding.m in Sources */,
Expand Down
7 changes: 6 additions & 1 deletion AKABeacon/AKABeacon/AKABeacon.h
Expand Up @@ -84,6 +84,7 @@ FOUNDATION_EXPORT const unsigned char AKABeaconVersionString[];

// Bindings/ViewBindings
#import <AKABeacon/AKAViewBinding.h>
#import <AKABeacon/AKAViewBinding+IBPropertySupport.h>
#import <AKABeacon/AKAControlViewBinding.h>

// Bindings/ViewBindings/UILabel
Expand All @@ -95,7 +96,7 @@ FOUNDATION_EXPORT const unsigned char AKABeaconVersionString[];

// Bindings/ViewBindings/ControlViewBindings/UISegmentedControl
#import <AKABeacon/UISegmentedControl+IBBindingProperties.h>
#import <AKABeacon/AKABinding_UISegmentedControl_selectionBinding.h>
#import <AKABeacon/AKABinding_UISegmentedControl_valueBinding.h>

// Bindings/ViewBindings/ControlViewBindings/UISwitch
#import <AKABeacon/UISwitch+AKAIBBindingProperties.h>
Expand All @@ -109,6 +110,10 @@ FOUNDATION_EXPORT const unsigned char AKABeaconVersionString[];
#import <AKABeacon/UIStepper+AKAIBBindingProperties.h>
#import <AKABeacon/AKABinding_UIStepper_valueBinding.h>

// Bindings/ViewBindings/ControlViewBindings/UIPickerView
#import <AKABeacon/UIPickerView+AKAIBBindingProperties.h>
#import <AKABeacon/AKABinding_UIPickerView_valueBinding.h>

// Bindings/ViewBindings/ControlViewBindings/KeyboardControlViewBindings
#import <AKABeacon/AKAKeyboardControlViewBinding.h>
#import <AKABeacon/AKAKeyboardControlViewBindingDelegate.h>
Expand Down
5 changes: 5 additions & 0 deletions AKABeacon/AKABeacon/Classes/AKABinding.h
Expand Up @@ -103,6 +103,11 @@ typedef AKAKeyboardControlViewBinding*_Nonnull req_AKAKeyboardContr

@end

@interface AKABinding(BindingAttributeBindings)

@property(nonatomic, readonly, nullable) NSDictionary<NSString*, AKABinding*>* attributeBindings;

@end

@interface AKABinding(Internal)

Expand Down
34 changes: 26 additions & 8 deletions AKABeacon/AKABeacon/Classes/AKABinding.m
Expand Up @@ -12,6 +12,7 @@
@import AKACommons.NSObject_AKAConcurrencyTools;

#import "AKABinding.h"
#import "AKAPropertyBinding.h"
#import "AKABindingDelegate.h"
#import "AKABindingExpression.h"
#import "AKABindingErrors.h"
Expand All @@ -21,10 +22,9 @@

@interface AKABinding () {
BOOL _isUpdatingTargetValueForSourceValueChange;
NSMutableDictionary<NSString*, AKABinding*>* _attributeBindings;
}

@property(nonatomic, readonly, nullable) NSMutableDictionary<NSString*, AKABinding*>* attributeBindings;

@end

#pragma mark - AKABinding Implementation
Expand Down Expand Up @@ -56,11 +56,14 @@ - (instancetype _Nullable) initWithTarget:(id)target
AKABindingSpecification* specification = [self.class specification];

BOOL relaxAttributeChecks = self.class != bindingExpression.bindingType;
if (![bindingExpression validateWithSpecification:specification.bindingSourceSpecification
overrideAllowUnknownAttributes:relaxAttributeChecks
error:&localError])
if (specification.bindingSourceSpecification)
{
self = nil;
if (![bindingExpression validateWithSpecification:specification.bindingSourceSpecification
overrideAllowUnknownAttributes:relaxAttributeChecks
error:&localError])
{
self = nil;
}
}

if (self = [self init])
Expand Down Expand Up @@ -202,8 +205,19 @@ - (BOOL) setupAttributeBindingsWithExpression:(req_AKABindingExpre

Class bindingType = attributeSpec.bindingType;

if (bindingType == nil)
{
bindingType = [AKAPropertyBinding class];
}

if (bindingType != nil)
{
NSAssert(self->_attributeBindings[bindingPropertyName] == nil, @"Invalid attempt to bind property %@ with expression %@ in context %@. Property is already bound: %@. Binding expression validation of binding %@ should have failed for use of exclusive attribute bindings.", bindingPropertyName,
attribute,
bindingContext,
self->_attributeBindings[bindingPropertyName],
self);

__weak typeof(self) weakSelf = self;
AKAProperty* targetProperty =
[AKAProperty propertyOfWeakKeyValueTarget:self
Expand All @@ -218,7 +232,7 @@ - (BOOL) setupAttributeBindingsWithExpression:(req_AKABindingExpre
property:NSSelectorFromString(bindingPropertyName)
expression:attribute
context:bindingContext
delegate:nil
delegate:weakSelf
error:error];
self->_attributeBindings[bindingPropertyName] = propertyBinding;
}
Expand All @@ -242,6 +256,11 @@ - (BOOL)isUpdatingTargetValueForSourceValueChange
return _isUpdatingTargetValueForSourceValueChange;
}

- (NSDictionary<NSString *,AKABinding *> *)attributeBindings
{
return _attributeBindings;
}

#pragma mark - Conversion

- (BOOL) convertSourceValue:(opt_id)sourceValue
Expand Down Expand Up @@ -544,7 +563,6 @@ - (void) bindingProperty:(req_NSString)bindin
value:(opt_id)oldValue
didChangeToNewValue:(opt_id)newValue
{
// TODO: remove debug output
AKALogDebug(@"Binding %@ property %@ value %@ changed to %@", self, bindingPropertyName, oldValue, newValue);
}

Expand Down
17 changes: 16 additions & 1 deletion AKABeacon/AKABeacon/Classes/AKABindingErrors.h
Expand Up @@ -27,6 +27,9 @@ typedef NS_ENUM(NSInteger, AKABindingErrorCodes)
AKABindingErrorInvalidBindingExpressionInvalidUIFontTraitSpecification,

AKABindingErrorInvalidBindingSourceValueType,
AKABindingErrorConversionOfTargetToSourceFailedTargetOutOfRange,
AKABindingErrorConversionOfTargetToSourceFailedInvalidTargetType,
AKABindingErrorConversionOfSourceToTargetFailedInvalidSourceType,
AKABindingErrorConversionOfTargetToSourceUsingFormatterFailed,
AKABindingErrorConversionOfSourceToTargetUsingFormatterFailed,
};
Expand Down Expand Up @@ -75,7 +78,7 @@ typedef NS_ENUM(NSInteger, AKABindingErrorCodes)
forEnumerationType:(req_NSString)enumerationType
withValuesByName:(NSDictionary<NSString*, NSNumber*>*_Nonnull)valuesByName;

#pragma mark - Binding Source Validation Errrors (Runtime validation)
#pragma mark - Binding Source Validation Errors (Runtime validation)

+ (req_NSError) invalidBinding:(req_AKABinding)binding
sourceValue:(opt_id)value
Expand All @@ -87,6 +90,18 @@ typedef NS_ENUM(NSInteger, AKABindingErrorCodes)

#pragma mark - Binding Conversion Errors

+ (req_NSError) bindingErrorConversionOfBinding:(req_AKABinding)binding
targetValue:(opt_id)targetValue
failedWithRangeError:(NSRange)expectedRange;

+ (req_NSError) bindingErrorConversionOfBinding:(req_AKABinding)binding
targetValue:(opt_id)targetValue
failedWithInvalidTypeExpected:(req_Class)expectedType;

+ (req_NSError) bindingErrorConversionOfBinding:(req_AKABinding)binding
sourceValue:(opt_id)sourceValue
failedWithInvalidTypeExpected:(req_Class)expectedType;

+ (req_NSError) bindingErrorConversionOfBinding:(req_AKABinding)binding
targetValue:(opt_id)targetValue
usingFormatter:(req_NSFormatter)formatter
Expand Down

0 comments on commit 0411870

Please sign in to comment.