aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTomáš Znamenáček2014-08-07 12:55:59 +0200
committerTomáš Znamenáček2015-01-07 15:42:22 +0100
commit46aa323115c2ebe7128aba39c0296634d232bbf6 (patch)
tree8ac85cbbe5b5470c02cd4049ded389f023cb46af
parent5f5f6cb9d086853065b2546e72d71a38230c6b59 (diff)
downloadMASShortcut-46aa323115c2ebe7128aba39c0296634d232bbf6.tar.bz2
Added a simplified binding API for MASShortcutView.
This returns the associatedUserDefaultsKey property used in previous code versions, only the implementation uses less magic.
-rw-r--r--Demo/AppDelegate.m5
-rw-r--r--Framework/MASShortcutView+Bindings.h25
-rw-r--r--Framework/MASShortcutView+Bindings.m50
-rw-r--r--Framework/Shortcut.h1
-rw-r--r--MASShortcut.xcodeproj/project.pbxproj8
5 files changed, 85 insertions, 4 deletions
diff --git a/Demo/AppDelegate.m b/Demo/AppDelegate.m
index 0c62358..7aff3d1 100644
--- a/Demo/AppDelegate.m
+++ b/Demo/AppDelegate.m
@@ -20,10 +20,7 @@ NSString *const MASPreferenceKeyConstantShortcutEnabled = @"MASDemoConstantShort
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
// Shortcut view will follow and modify user preferences automatically
- [_shortcutView bind:MASShortcutBinding
- toObject:[NSUserDefaultsController sharedUserDefaultsController]
- withKeyPath:[@"values." stringByAppendingString:MASPreferenceKeyShortcut]
- options:@{NSValueTransformerNameBindingOption:NSKeyedUnarchiveFromDataTransformerName}];
+ [_shortcutView setAssociatedUserDefaultsKey:MASPreferenceKeyShortcut];
// Activate the global keyboard shortcut if it was enabled last time
[self resetShortcutRegistration];
diff --git a/Framework/MASShortcutView+Bindings.h b/Framework/MASShortcutView+Bindings.h
new file mode 100644
index 0000000..b0148e7
--- /dev/null
+++ b/Framework/MASShortcutView+Bindings.h
@@ -0,0 +1,25 @@
+#import "MASShortcutView.h"
+
+/**
+ @brief A simplified interface to bind the recorder value to user defaults.
+
+ You can bind the @p shortcutValue to user defaults using the standard
+ @p bind:toObject:withKeyPath:options: call, but since that’s a lot to type
+ and read, here’s a simpler option.
+
+ Setting the @p associatedUserDefaultsKey binds the view’s shortcut value
+ to the given user defaults key. You can supply a value transformer to convert
+ values between user defaults and @p MASShortcut. If you don’t supply
+ a transformer, the @p NSUnarchiveFromDataTransformerName will be used
+ automatically.
+
+ Set @p associatedUserDefaultsKey to @p nil to disconnect the binding.
+*/
+@interface MASShortcutView (Bindings)
+
+@property(copy) NSString *associatedUserDefaultsKey;
+
+- (void) setAssociatedUserDefaultsKey: (NSString*) newKey withTransformer: (NSValueTransformer*) transformer;
+- (void) setAssociatedUserDefaultsKey: (NSString*) newKey withTransformerName: (NSString*) transformerName;
+
+@end
diff --git a/Framework/MASShortcutView+Bindings.m b/Framework/MASShortcutView+Bindings.m
new file mode 100644
index 0000000..7a6064c
--- /dev/null
+++ b/Framework/MASShortcutView+Bindings.m
@@ -0,0 +1,50 @@
+#import "MASShortcutView+Bindings.h"
+
+@implementation MASShortcutView (Bindings)
+
+- (NSString*) associatedUserDefaultsKey
+{
+ NSDictionary* bindingInfo = [self infoForBinding:MASShortcutBinding];
+ if (bindingInfo != nil) {
+ NSString *keyPath = [bindingInfo objectForKey:NSObservedKeyPathKey];
+ NSString *key = [keyPath stringByReplacingOccurrencesOfString:@"values." withString:@""];
+ return key;
+ } else {
+ return nil;
+ }
+}
+
+- (void) setAssociatedUserDefaultsKey: (NSString*) newKey withTransformer: (NSValueTransformer*) transformer
+{
+ // Break previous binding if any
+ NSString *currentKey = [self associatedUserDefaultsKey];
+ if (currentKey != nil) {
+ [self unbind:currentKey];
+ }
+
+ // Stop if the new binding is nil
+ if (newKey == nil) {
+ return;
+ }
+
+ NSDictionary *options = transformer ?
+ @{NSValueTransformerBindingOption:transformer} :
+ nil;
+
+ [self bind:MASShortcutBinding
+ toObject:[NSUserDefaultsController sharedUserDefaultsController]
+ withKeyPath:[@"values." stringByAppendingString:newKey]
+ options:options];
+}
+
+- (void) setAssociatedUserDefaultsKey: (NSString*) newKey withTransformerName: (NSString*) transformerName
+{
+ [self setAssociatedUserDefaultsKey:newKey withTransformer:[NSValueTransformer valueTransformerForName:transformerName]];
+}
+
+- (void) setAssociatedUserDefaultsKey: (NSString*) newKey
+{
+ [self setAssociatedUserDefaultsKey:newKey withTransformerName:NSUnarchiveFromDataTransformerName];
+}
+
+@end
diff --git a/Framework/Shortcut.h b/Framework/Shortcut.h
index df33f17..e131395 100644
--- a/Framework/Shortcut.h
+++ b/Framework/Shortcut.h
@@ -4,3 +4,4 @@
#import "MASShortcutBinder.h"
#import "MASDictionaryTransformer.h"
#import "MASShortcutView.h"
+#import "MASShortcutView+Bindings.h" \ No newline at end of file
diff --git a/MASShortcut.xcodeproj/project.pbxproj b/MASShortcut.xcodeproj/project.pbxproj
index ae9fde9..51aeae2 100644
--- a/MASShortcut.xcodeproj/project.pbxproj
+++ b/MASShortcut.xcodeproj/project.pbxproj
@@ -36,6 +36,8 @@
0DC2F18D1993708A003A0131 /* MASDictionaryTransformer.h in Headers */ = {isa = PBXBuildFile; fileRef = 0DC2F18B1993708A003A0131 /* MASDictionaryTransformer.h */; };
0DC2F18E1993708A003A0131 /* MASDictionaryTransformer.m in Sources */ = {isa = PBXBuildFile; fileRef = 0DC2F18C1993708A003A0131 /* MASDictionaryTransformer.m */; };
0DC2F190199372B4003A0131 /* MASDictionaryTransformerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 0DC2F18F199372B4003A0131 /* MASDictionaryTransformerTests.m */; };
+ 0DC2F19819938EFA003A0131 /* MASShortcutView+Bindings.h in Headers */ = {isa = PBXBuildFile; fileRef = 0DC2F19619938EFA003A0131 /* MASShortcutView+Bindings.h */; };
+ 0DC2F19919938EFA003A0131 /* MASShortcutView+Bindings.m in Sources */ = {isa = PBXBuildFile; fileRef = 0DC2F19719938EFA003A0131 /* MASShortcutView+Bindings.m */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
@@ -100,6 +102,8 @@
0DC2F18B1993708A003A0131 /* MASDictionaryTransformer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MASDictionaryTransformer.h; path = Framework/MASDictionaryTransformer.h; sourceTree = "<group>"; };
0DC2F18C1993708A003A0131 /* MASDictionaryTransformer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MASDictionaryTransformer.m; path = Framework/MASDictionaryTransformer.m; sourceTree = "<group>"; };
0DC2F18F199372B4003A0131 /* MASDictionaryTransformerTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MASDictionaryTransformerTests.m; path = Framework/MASDictionaryTransformerTests.m; sourceTree = "<group>"; };
+ 0DC2F19619938EFA003A0131 /* MASShortcutView+Bindings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "MASShortcutView+Bindings.h"; path = "Framework/MASShortcutView+Bindings.h"; sourceTree = "<group>"; };
+ 0DC2F19719938EFA003A0131 /* MASShortcutView+Bindings.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "MASShortcutView+Bindings.m"; path = "Framework/MASShortcutView+Bindings.m"; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@@ -220,6 +224,8 @@
children = (
0D827D211990D55E0010B8EF /* MASShortcutView.h */,
0D827D221990D55E0010B8EF /* MASShortcutView.m */,
+ 0DC2F19619938EFA003A0131 /* MASShortcutView+Bindings.h */,
+ 0DC2F19719938EFA003A0131 /* MASShortcutView+Bindings.m */,
);
name = UI;
sourceTree = "<group>";
@@ -262,6 +268,7 @@
0D827DAD199132840010B8EF /* MASShortcutBinder.h in Headers */,
0D827D771990F81E0010B8EF /* Shortcut.h in Headers */,
0DC2F17619922798003A0131 /* MASHotKey.h in Headers */,
+ 0DC2F19819938EFA003A0131 /* MASShortcutView+Bindings.h in Headers */,
0D827D9E19911A190010B8EF /* MASShortcutValidator.h in Headers */,
0DC2F18D1993708A003A0131 /* MASDictionaryTransformer.h in Headers */,
0D827DA519912D240010B8EF /* MASShortcutMonitor.h in Headers */,
@@ -395,6 +402,7 @@
0D827D2C1990D55E0010B8EF /* MASShortcutView.m in Sources */,
0D827D261990D55E0010B8EF /* MASShortcut.m in Sources */,
0DC2F18E1993708A003A0131 /* MASDictionaryTransformer.m in Sources */,
+ 0DC2F19919938EFA003A0131 /* MASShortcutView+Bindings.m in Sources */,
0DC2F17D199232F7003A0131 /* MASShortcutBinder.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;