我使用标记字段作为文本字段文本视图字段的标志,以自动跳转到下一个字段:
- (BOOL)findNextEntryFieldAsResponder:(UIControl *)field {
BOOL retVal = NO;
for (UIView* aView in mEntryFields) {
if (aView.tag == (field.tag + 1)) {
[aView becomeFirstResponder];
retVal = YES;
break;
}
}
return retVal;
}
当按下Next键时,它在自动跳转到下一个字段方面工作正常。但是,我的情况是键盘在某些领域是不同的。例如,一个字段是数字&标点符号,下一个是默认值(字母键)。对于数字&标点符号键盘没问题,但下一个字段将保持相同的布局。它要求用户按123返回ABC键盘。
我不确定是否有任何方法可以重置字段的键盘作为其在xib中定义的键盘?不确定是否有可用的API?我想我必须做的事情是下面的代表吗?
-(void)textFieldDidBegingEditing:(UITextField*) textField {
// reset to the keyboard to request specific keyboard view?
....
}
行。我找到了a solution close to my case by slatvik:
-(void) textFieldDidBeginEditing:(UITextField*) textField {
textField.keyboardType = UIKeybardTypeAlphabet;
}
但是,如果前面的文本字段是数字,则自动跳转到下一个字段时键盘会保持数字。有没有办法将键盘设置为字母模式?
答案 0 :(得分:0)
最后,我找到了解决问题的方法。在我的例子中,我喜欢使用Entry或Next键自动跳转到下一个可用字段。如果顺序中的两个字段具有完全不同的键盘,则键盘更改应该没问题。但是,如果一个是带数字模式的键盘,而下一个是字母模式,那么自动跳转不会导致相同的键盘改变模式。
主要原因是我调用findNextEntryFieldAsResponder:方法是在textFieldShouldReturn:delegate方法中完成的。该呼叫导致下一个字段成为响应者:
...
[aView becomeFirstResponder]; // cause the next fields textFieldDidBeginEditing: event
...
我在NSLog调试消息中找到了这个:
textFieldShouldReturn: start
findNextEntryFieldAsResponder
textFieldDidBeginEditing: start
...
textFieldDidBeginEditing: end
...
textFieldShouldReturn: end
我需要做的是将下一个字段作为textFieldShouldReturn:event call中的响应者。我尝试使用iphone的本地通知框架在textFieldShouldReturn中触发async-notification事件:它完成了我的期望。
以下是我更新的代码:
- (BOOL)findNextEntryFieldAsResponder:(UIControl *)field {
BOOL retVal = NO;
for (UIView* aView in mEntryFields) {
if (aView.tag == (field.tag + 1)) {
if ([self.specialInputs containsObject:[NSNumber numberWithInt:aView.tag]]) {
NSNotification* notification = [NSNotification notificationWithName:
@"myNotification" object:aView];
[[NSNotificationQueue defaultQueue]
enqueueNotification:notification postingStyle:NSPostWhenIdle
coaslesceMask:NSNotificationCoalescingOnName forModes:nil];
[[NSNotifiationCenter defaultCenter] addObserver:self
selector:@selector(keyboardShowNofication:)
name:@"myNotification" object:nil];
}
else {
[aView becomeFirstResponder];
}
retVal = YES;
break;
}
}
return retVal;
}
...
// Notification event arrives!
-(void) keyboardShowNofication:(NSNotification*) notification {
UIResponder* responder = [notification object];
if (responder) {
[responder becomeFirstResponder]; // now the next field is responder
}
}
...
-(void) dealloc {
...
// remember to remove all the notifications from the center!
[[NSNotificationCenter defaultCenter] removeObserver:self];
...
}
其中specialInputs是int值的NSArray。可以使用列表标记作为特殊输入来设置属性。实际上,我认为所有输入都可以被视为specialInputs,它也可以正常工作(只需要更多通知)。