From b7592cbf71be460c76e20828debfca8e12409bb7 Mon Sep 17 00:00:00 2001 From: hackiftekhar Date: Wed, 8 Apr 2015 17:13:00 +0530 Subject: [PATCH] Ability to go next/previous programmatically #189 --- IQKeyBoardManager/IQKeyboardManager.h | 22 ++- IQKeyBoardManager/IQKeyboardManager.m | 205 ++++++++++++++++---------- KeyboardTextFieldDemo/.DS_Store | Bin 15364 -> 15364 bytes 3 files changed, 147 insertions(+), 80 deletions(-) diff --git a/IQKeyBoardManager/IQKeyboardManager.h b/IQKeyBoardManager/IQKeyboardManager.h index 7160fa1..b1ed50b 100755 --- a/IQKeyBoardManager/IQKeyboardManager.h +++ b/IQKeyBoardManager/IQKeyboardManager.h @@ -126,7 +126,7 @@ @property(nonatomic, assign) UIKeyboardAppearance keyboardAppearance; ///--------------------------------------------- -/// @name UITextField/UITextView Resign handling +/// @name UITextField/UITextView Next/Previous/Resign handling ///--------------------------------------------- /** @@ -139,6 +139,26 @@ */ - (void)resignFirstResponder; +/** + Returns YES if can navigate to previous responder textField/textView, otherwise NO. + */ +@property (nonatomic, readonly) BOOL canGoPrevious; + +/** + Returns YES if can navigate to next responder textField/textView, otherwise NO. + */ +@property (nonatomic, readonly) BOOL canGoNext; + +/** + Navigate to previous responder textField/textView. + */ +- (void)goPrevious; + +/** + Navigate to next responder textField/textView. + */ +- (void)goNext; + ///---------------------------- /// @name UIScrollView handling ///---------------------------- diff --git a/IQKeyBoardManager/IQKeyboardManager.m b/IQKeyBoardManager/IQKeyboardManager.m index 9a36d02..b7f4235 100755 --- a/IQKeyBoardManager/IQKeyboardManager.m +++ b/IQKeyBoardManager/IQKeyboardManager.m @@ -1194,7 +1194,7 @@ void _IQShowLog(NSString *logString); { // Retaining textFieldView UIView *textFieldRetain = _textFieldView; - + //Resigning first responder BOOL isResignFirstResponder = [_textFieldView resignFirstResponder]; @@ -1206,6 +1206,126 @@ void _IQShowLog(NSString *logString); _IQShowLog([NSString stringWithFormat:@"Refuses to Resign first responder: %@",[_textFieldView _IQDescription]]); } + else if (textFieldRetain.doneInvocation) + { + [textFieldRetain.doneInvocation invoke]; + } + } +} + +/** Returns YES if can navigate to previous responder textField/textView, otherwise NO. */ +-(BOOL)canGoPrevious +{ + //Getting all responder view's. + NSArray *textFields = [self responderViews]; + + if ([textFields containsObject:_textFieldView]) + { + //Getting index of current textField. + NSUInteger index = [textFields indexOfObject:_textFieldView]; + + //If it is not first textField. then it's previous object can becomeFirstResponder. + if (index > 0) + { + return YES; + } + } + + return NO; +} + +/** Returns YES if can navigate to next responder textField/textView, otherwise NO. */ +-(BOOL)canGoNext +{ + //Getting all responder view's. + NSArray *textFields = [self responderViews]; + + if ([textFields containsObject:_textFieldView]) + { + //Getting index of current textField. + NSUInteger index = [textFields indexOfObject:_textFieldView]; + + //If it is not last textField. then it's next object becomeFirstResponder. + if (index < textFields.count-1) + { + return YES; + } + } + + return NO; +} + +/** Navigate to previous responder textField/textView. */ +-(void)goPrevious +{ + //Getting all responder view's. + NSArray *textFields = [self responderViews]; + + if ([textFields containsObject:_textFieldView]) + { + //Getting index of current textField. + NSUInteger index = [textFields indexOfObject:_textFieldView]; + + //If it is not first textField. then it's previous object becomeFirstResponder. + if (index > 0) + { + UITextField *nextTextField = [textFields objectAtIndex:index-1]; + + // Retaining textFieldView + UIView *textFieldRetain = _textFieldView; + + BOOL isAcceptAsFirstResponder = [nextTextField becomeFirstResponder]; + + // If it refuses then becoming previous textFieldView as first responder again. (Bug ID: #96) + if (isAcceptAsFirstResponder == NO) + { + //If next field refuses to become first responder then restoring old textField as first responder. + [textFieldRetain becomeFirstResponder]; + + _IQShowLog([NSString stringWithFormat:@"Refuses to become first responder: %@",[nextTextField _IQDescription]]); + } + else if (textFieldRetain.previousInvocation) + { + [textFieldRetain.previousInvocation invoke]; + } + } + } +} + +/** Navigate to next responder textField/textView. */ +-(void)goNext +{ + //Getting all responder view's. + NSArray *textFields = [self responderViews]; + + if ([textFields containsObject:_textFieldView]) + { + //Getting index of current textField. + NSUInteger index = [textFields indexOfObject:_textFieldView]; + + //If it is not last textField. then it's next object becomeFirstResponder. + if (index < textFields.count-1) + { + UITextField *nextTextField = [textFields objectAtIndex:index+1]; + + // Retaining textFieldView + UIView *textFieldRetain = _textFieldView; + + BOOL isAcceptAsFirstResponder = [nextTextField becomeFirstResponder]; + + // If it refuses then becoming previous textFieldView as first responder again. (Bug ID: #96) + if (isAcceptAsFirstResponder == NO) + { + //If next field refuses to become first responder then restoring old textField as first responder. + [textFieldRetain becomeFirstResponder]; + + _IQShowLog([NSString stringWithFormat:@"Refuses to become first responder: %@",[nextTextField _IQDescription]]); + } + else if (textFieldRetain.nextInvocation) + { + [textFieldRetain.nextInvocation invoke]; + } + } } } @@ -1436,37 +1556,9 @@ void _IQShowLog(NSString *logString); [[UIDevice currentDevice] playInputClick]; } - //Getting all responder view's. - NSArray *textFields = [self responderViews]; - - if ([textFields containsObject:_textFieldView]) + if ([self canGoPrevious]) { - //Getting index of current textField. - NSUInteger index = [textFields indexOfObject:_textFieldView]; - - //If it is not first textField. then it's previous object becomeFirstResponder. - if (index > 0) - { - UITextField *nextTextField = [textFields objectAtIndex:index-1]; - - // Retaining textFieldView - UIView *textFieldRetain = _textFieldView; - - BOOL isAcceptAsFirstResponder = [nextTextField becomeFirstResponder]; - - // If it refuses then becoming previous textFieldView as first responder again. (Bug ID: #96) - if (isAcceptAsFirstResponder == NO) - { - //If next field refuses to become first responder then restoring old textField as first responder. - [textFieldRetain becomeFirstResponder]; - - _IQShowLog([NSString stringWithFormat:@"Refuses to become first responder: %@",[nextTextField _IQDescription]]); - } - else if (textFieldRetain.previousInvocation) - { - [textFieldRetain.previousInvocation invoke]; - } - } + [self goPrevious]; } } @@ -1480,37 +1572,9 @@ void _IQShowLog(NSString *logString); [[UIDevice currentDevice] playInputClick]; } - //Getting all responder view's. - NSArray *textFields = [self responderViews]; - - if ([textFields containsObject:_textFieldView]) + if ([self canGoNext]) { - //Getting index of current textField. - NSUInteger index = [textFields indexOfObject:_textFieldView]; - - //If it is not last textField. then it's next object becomeFirstResponder. - if (index < textFields.count-1) - { - UITextField *nextTextField = [textFields objectAtIndex:index+1]; - - // Retaining textFieldView - UIView *textFieldRetain = _textFieldView; - - BOOL isAcceptAsFirstResponder = [nextTextField becomeFirstResponder]; - - // If it refuses then becoming previous textFieldView as first responder again. (Bug ID: #96) - if (isAcceptAsFirstResponder == NO) - { - //If next field refuses to become first responder then restoring old textField as first responder. - [textFieldRetain becomeFirstResponder]; - - _IQShowLog([NSString stringWithFormat:@"Refuses to become first responder: %@",[nextTextField _IQDescription]]); - } - else if (textFieldRetain.nextInvocation) - { - [textFieldRetain.nextInvocation invoke]; - } - } + [self goNext]; } } @@ -1524,24 +1588,7 @@ void _IQShowLog(NSString *logString); [[UIDevice currentDevice] playInputClick]; } - // Retaining textFieldView - UIView *textFieldRetain = _textFieldView; - - //Resigning first responder - BOOL isResignFirstResponder = [_textFieldView resignFirstResponder]; - - // If it refuses then becoming it as first responder again. (Bug ID: #96) - if (isResignFirstResponder == NO) - { - //If it refuses to resign then becoming it first responder again for getting notifications callback. - [textFieldRetain becomeFirstResponder]; - - _IQShowLog([NSString stringWithFormat:@"Refuses to Resign first responder: %@",[_textFieldView _IQDescription]]); - } - else if (textFieldRetain.doneInvocation) - { - [textFieldRetain.doneInvocation invoke]; - } + [self resignFirstResponder]; } #pragma mark - Tracking untracking diff --git a/KeyboardTextFieldDemo/.DS_Store b/KeyboardTextFieldDemo/.DS_Store index 9e64480a44afab7d88d1590fe809ae34c8ec0b1c..6141ef1ff5cf19ded51dca811ad8e3c5522afb6f 100644 GIT binary patch delta 15 WcmZpvXsOr`Bgk~WYjd37GA#f$bp~?) delta 15 WcmZpvXsOr`Bgk~;!sa-^Wm*6@1O~PM