Ability to go next/previous programmatically #189

This commit is contained in:
hackiftekhar
2015-04-08 17:13:00 +05:30
parent 20c6dbe6da
commit b7592cbf71
3 changed files with 147 additions and 80 deletions

View File

@@ -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
///----------------------------

View File

@@ -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

Binary file not shown.