我使用“返回键”的“下一个”值来获取“下一步”按钮代替“完成”按钮,但是(显然)按下它不会自动移动到我视图中的下一个UITextField。
这样做的正确方法是什么?在一个更大的主题上,有哪些提示可以在iPhone SDK中正确构建表单?
答案 0 :(得分:36)
将一些对象作为第一个文本字段的委托,并实现- (BOOL)textFieldShouldReturn:(UITextField *)textField
方法;在其中,调用第二个文本字段-becomeFirstResponder
。从中返回YES
将使文本字段执行返回按钮的默认行为 - 我认为通常会发送其操作消息。如果您没有添加任何内容作为该操作的目标,那么返回的内容并不重要。
答案 1 :(得分:34)
在挪亚的答案的基础上,如果你有很多文本字段并且不想拥有一堆if,那么你可以这样做:
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
//[[self.view viewWithTag:textField.tag+1] becomeFirstResponder];
UIView *view = [self.view viewWithTag:textField.tag + 1];
if (!view)
[textField resignFirstResponder];
else
[view becomeFirstResponder];
return YES;
}
从任意数字开始标记每个文本字段,只要它们按顺序标记,在故事板或代码中标记,就应该有效。
答案 2 :(得分:2)
对于Swift:
func textFieldShouldReturn(textField: UITextField) -> Bool {
//your collection of textfields
guard let i = textFields.indexOf(textField) else { return false }
if i + 1 < textFields.count {
textFields[i + 1].becomeFirstResponder()
return true
}
textField.resignFirstResponder()
return true
}
答案 3 :(得分:1)
这看起来效果很好,并不需要许多人建议的标签系统。但是,这个解决方案有两点需要注意:
UITextFields需要在界面构建器中按正确的顺序排列。
-(BOOL)textFieldShouldReturn:(UITextField *)textField {
/*
* 1. Loop through the textfield's superview
* 2. Get the next textfield in the superview
* 3. Focus that textfield
*/
UIView *superView = [textField superview];
BOOL foundCurrent = false;
for (UITextField *tf in superView.subviews) {
// Set focus on the next textfield
if (foundCurrent) {
[tf becomeFirstResponder];
return NO;
}
//Find current textfield
if ([tf isEqual:textField]) {
foundCurrent = true;
}
}
return YES;
}
答案 4 :(得分:1)
我不喜欢处理标签,所以这是我的解决方案。在IBOutletCollection
中创建所有textField的ViewController
,拖动以按照从上到下的顺序连接textField。
@interface ViewController () <UITextFieldDelegate>
@property (strong, nonatomic) IBOutletCollection(UITextField) NSArray *allTextFields;
@end
在viewDidLoad中设置textFields委托。 (或在故事板中设置)。
for (VVTextField *tf in self.allTextFields) {
tf.delegate = self;
}
然后实现UITextField Delegate
#pragma mark - UITextField Delegate
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
NSUInteger currentIndex = [self.allTextFields indexOfObject:textField];
NSUInteger nextIndex = currentIndex+1;
if (nextIndex < self.allTextFields.count) {
[[self.allTextFields objectAtIndex:nextIndex] becomeFirstResponder];
} else {
[[self.allTextFields objectAtIndex:currentIndex] resignFirstResponder];
}
return YES;
}
答案 5 :(得分:0)
我一直在努力解决这个问题......结果我创建了一个用于处理多个文本字段的小型库。你可以在github上找到它GNKeyboardAwareScrollView#GNTextFieldsManager。
您可以使用文本字段数组初始化它:
NSArray *myTextFields = @[...]; // the order of array matters!
GNTextFieldsManager *manager = [[GNTextFieldsManager alloc] initWithTextFields:myTextFields];
或者通过指定父视图(以及为所有视图设置标记):
GNTextFieldsManager *manager = [[GNTextFieldsManager alloc] initWithView:self.view];
希望我对某人有用:)