在UITextField上使用“Next”版本的Return按钮移动到下一个UITextField的最佳方法

时间:2009-06-14 05:49:17

标签: iphone

我使用“返回键”的“下一个”值来获取“下一步”按钮代替“完成”按钮,但是(显然)按下它不会自动移动到我视图中的下一个UITextField。

这样做的正确方法是什么?在一个更大的主题上,有哪些提示可以在iPhone SDK中正确构建表单?

6 个答案:

答案 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)

这看起来效果很好,并不需要许多人建议的标签系统。但是,这个解决方案有两点需要注意:

  • 所有UITextField必须位于同一个UIView中(具有相同的superview)。
  • 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];

希望我对某人有用:)