From a6baba31fb42a4e1dfc52e9c690f01e4971c6e6f Mon Sep 17 00:00:00 2001 From: Matthew Purland Date: Wed, 10 Sep 2014 17:06:25 -0700 Subject: [PATCH 1/3] Do not resign first responder if iOS 7 or later. --- XCDFormInputAccessoryView/XCDFormInputAccessoryView.m | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/XCDFormInputAccessoryView/XCDFormInputAccessoryView.m b/XCDFormInputAccessoryView/XCDFormInputAccessoryView.m index deb715e..2dc0e6c 100644 --- a/XCDFormInputAccessoryView/XCDFormInputAccessoryView.m +++ b/XCDFormInputAccessoryView/XCDFormInputAccessoryView.m @@ -188,7 +188,10 @@ - (void) selectAdjacentResponderAtIndex:(NSInteger)index adjacentResponder = [self.responders objectAtIndex:adjacentResponderIndex]; // Resign the previous responder before selecting the next one, so the UIKeyboard events could be notified properly. - [firstResponder resignFirstResponder]; + // Only resign if < iOS 7 + if (!(NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1)) { + [firstResponder resignFirstResponder]; + } [adjacentResponder becomeFirstResponder]; } From 24c59ec50c4ded0592cfadb7d66ca16449ac3fa6 Mon Sep 17 00:00:00 2001 From: Matthew Purland Date: Wed, 10 Sep 2014 17:36:57 -0700 Subject: [PATCH 2/3] Appearance setters for tintColor and barTintColor. --- .../XCDFormInputAccessoryView.h | 3 +++ .../XCDFormInputAccessoryView.m | 12 ++++++++++++ 2 files changed, 15 insertions(+) diff --git a/XCDFormInputAccessoryView/XCDFormInputAccessoryView.h b/XCDFormInputAccessoryView/XCDFormInputAccessoryView.h index f0c79d0..2f24871 100644 --- a/XCDFormInputAccessoryView/XCDFormInputAccessoryView.h +++ b/XCDFormInputAccessoryView/XCDFormInputAccessoryView.h @@ -25,6 +25,9 @@ @property (nonatomic, assign) BOOL hasDoneButton; +@property (nonatomic, strong) UIColor *tintColor UI_APPEARANCE_SELECTOR; +@property (nonatomic, strong) UIColor *barTintColor UI_APPEARANCE_SELECTOR; + - (void) setHasDoneButton:(BOOL)hasDoneButton animated:(BOOL)animated; @end diff --git a/XCDFormInputAccessoryView/XCDFormInputAccessoryView.m b/XCDFormInputAccessoryView/XCDFormInputAccessoryView.m index 2dc0e6c..46fd9d5 100644 --- a/XCDFormInputAccessoryView/XCDFormInputAccessoryView.m +++ b/XCDFormInputAccessoryView/XCDFormInputAccessoryView.m @@ -54,6 +54,8 @@ - (instancetype) initWithResponders:(NSArray *)responders tintColor:(UIColor *)t return nil; _responders = responders; + + self.backgroundColor = [UIColor clearColor]; self.toolbar = [[UIToolbar alloc] init]; self.toolbar.autoresizingMask = UIViewAutoresizingFlexibleWidth; @@ -214,4 +216,14 @@ - (void) done [[UIApplication sharedApplication] sendAction:@selector(resignFirstResponder) to:nil from:nil forEvent:nil]; } +- (void)setTintColor:(UIColor *)tintColor { + _tintColor = tintColor; + self.toolbar.tintColor = tintColor; +} + +- (void)setBarTintColor:(UIColor *)barTintColor { + _barTintColor = barTintColor; + self.toolbar.barTintColor = barTintColor; +} + @end From 1ab6bbb775313bafbc51a793ddb33249a709d1b6 Mon Sep 17 00:00:00 2001 From: Matthew Purland Date: Tue, 21 Oct 2014 16:09:46 -0700 Subject: [PATCH 3/3] Action handler block for handling previous, next, and done actions from accessory view. --- .../XCDFormInputAccessoryView.h | 14 ++++++ .../XCDFormInputAccessoryView.m | 49 ++++++++++++++++--- 2 files changed, 55 insertions(+), 8 deletions(-) diff --git a/XCDFormInputAccessoryView/XCDFormInputAccessoryView.h b/XCDFormInputAccessoryView/XCDFormInputAccessoryView.h index 2f24871..0acbe54 100644 --- a/XCDFormInputAccessoryView/XCDFormInputAccessoryView.h +++ b/XCDFormInputAccessoryView/XCDFormInputAccessoryView.h @@ -7,6 +7,14 @@ #import +typedef NS_ENUM(NSInteger, XCDFormInputAccessoryViewAction) { + XCDFormInputAccessoryViewActionNext, + XCDFormInputAccessoryViewActionPrevious, + XCDFormInputAccessoryViewActionDone +}; + +typedef BOOL (^XCDFormInputAccessoryViewActionBlock)(XCDFormInputAccessoryViewAction action); + @interface XCDFormInputAccessoryView : UIView /** @@ -27,6 +35,12 @@ @property (nonatomic, strong) UIColor *tintColor UI_APPEARANCE_SELECTOR; @property (nonatomic, strong) UIColor *barTintColor UI_APPEARANCE_SELECTOR; +@property (nonatomic, copy) XCDFormInputAccessoryViewActionBlock actionHandler; + +- (void) selectAdjacentResponderAtIndex:(NSInteger)index; +- (void) previous; +- (void) next; +- (void) done; - (void) setHasDoneButton:(BOOL)hasDoneButton animated:(BOOL)animated; diff --git a/XCDFormInputAccessoryView/XCDFormInputAccessoryView.m b/XCDFormInputAccessoryView/XCDFormInputAccessoryView.m index 46fd9d5..38358d3 100644 --- a/XCDFormInputAccessoryView/XCDFormInputAccessoryView.m +++ b/XCDFormInputAccessoryView/XCDFormInputAccessoryView.m @@ -170,7 +170,7 @@ - (void) setHasDoneButton:(BOOL)hasDoneButton animated:(BOOL)animated NSArray *items; if (hasDoneButton) - items = [self.toolbar.items arrayByAddingObject:[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(done)]]; + items = [self.toolbar.items arrayByAddingObject:[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(done:)]]; else items = [self.toolbar.items subarrayWithRange:NSMakeRange(0, 2)]; @@ -198,21 +198,54 @@ - (void) selectAdjacentResponderAtIndex:(NSInteger)index [adjacentResponder becomeFirstResponder]; } -- (void) previous:(UIBarButtonItem *)sender -{ +- (void) previous:(UIBarButtonItem *)sender { + BOOL shouldPrevious = YES; + + if (self.actionHandler) { + shouldPrevious = self.actionHandler(XCDFormInputAccessoryViewActionPrevious); + } + + if (shouldPrevious) { + [self previous]; + } +} + +- (void) next:(UIBarButtonItem *)sender { + BOOL shouldNext = YES; + + if (self.actionHandler) { + shouldNext = self.actionHandler(XCDFormInputAccessoryViewActionNext); + } + + if (shouldNext) { + [self next]; + } +} + +- (void) done:(UIBarButtonItem *)sender { + BOOL shouldDone = YES; + + if (self.actionHandler) { + shouldDone = self.actionHandler(XCDFormInputAccessoryViewActionDone); + } + + if (shouldDone) { + [self done]; + } +} + +- (void) previous { [self selectAdjacentResponderAtIndex:0]; } -- (void) next:(UIBarButtonItem *)sender -{ +- (void) next { [self selectAdjacentResponderAtIndex:1]; } -- (void) done -{ +- (void) done { UIResponder *firstResponder = [self firstResponder]; [firstResponder resignFirstResponder]; - + [[UIApplication sharedApplication] sendAction:@selector(resignFirstResponder) to:nil from:nil forEvent:nil]; }