1

新手 obj-c 问题。

我有一个带有四个自定义单元格的自定义表格视图。每个单元格中都有一个用于客户信息的可编辑文本字段。我需要通过输入附件视图改进文本字段之间的切换。 http://uaimage.com/image/62f08045

我创建了一个容量为 4 的 NSMutableArray。我标记了文本字段并将它们添加到文本字段委托方法中的此数组中:

- (BOOL) textFieldShouldReturn:(UITextField *)textField {
    FDTextFieldCell *cell = (FDTextFieldCell *)[textField superview];
    NSIndexPath *indexPath = [[self tableView] indexPathForCell:cell];

    if ([indexPath section] == 0) {
        if ([indexPath row] == 0) {
            [[FDProfile sharedProfile] setName:[textField text]];
            [textField setTag:1];
            [textFieldsArray insertObject:textField atIndex:0];
        } else if ([indexPath row] == 1) {
            [[FDProfile sharedProfile] setSurname:[textField text]];
            [textField setTag:2];
            [textFieldsArray insertObject:textField atIndex:1];
        } else if ([indexPath row] == 2) {
            [[FDProfile sharedProfile] setNickname:[textField text]];
            [textField setTag:3];
            [textFieldsArray insertObject:textField atIndex:2];
        } else if ([indexPath row] == 3) {
            [[FDProfile sharedProfile] setEmail:[textField text]];
            [textField setTag:4];
            [textFieldsArray insertObject:textField atIndex:3];
            [textField resignFirstResponder];
        }
    }

    [[self tableView] reloadData];
    return YES;
}

现在我尝试改进按钮“下一步”的功能:

- (void) inputAccessoryViewDidSelectNext:(FDInputAccessoryView *)view {
    for (UITextField *textField in [self textFieldsArray]) {
        if ([textField isFirstResponder]) {
     textField = [[self textFieldsArray] objectAtIndex:textField.tag + 1];
            [textField becomeFirstResponder];
        }

    }
}

但是这段代码不起作用。我认为使用快速枚举存在问题?

有人可以帮忙吗?谢谢,亚历克斯。


从 c-had 解决的一些想法:

  1. 为什么要在 textFieldShouldReturn: 中设置 textFieldsArray?这不应该在初始化完成的地方(例如视图控制器的viewDidLoad)完成吗?问题可能是您的阵列从未实际设置,或者只是部分设置。此外,将设置放在这里意味着它将被一遍又一遍地调用,每次都会改变你的数组并将事情搞砸。
  2. 你的标签少了一个。您应该从 0 开始分配它们,而不是 1(或考虑 inputAccessoryViewDidSelectNext 的差异:)。如果您的代码正常工作,它将跳过 2 个文本字段,因为第一个字段将返回标签 1,您将跳到 objectAtIndex:2,这是第三个字段。
  3. 你不考虑结束。如果您在最后一个字段,递增将不会回到开头。

我实际上建议根本不使用标签。相反,在设置时,只需遍历字段,将它们添加到您的数组中。然后,在 inputAccessoryViewDidSelectNext: 中,使用计数器而不是快速枚举来确定您的位置。

4

3 回答 3

3
  1. 你为什么要设置你的textFieldsArrayin textFieldShouldReturn:?这不应该在初始化完成viewDidLoad的地方(例如视图控制器)完成吗?问题可能是您的阵列从未实际设置,或者只是部分设置。此外,将设置放在这里意味着它将被一遍又一遍地调用,每次都会改变你的数组并将事情搞砸。
  2. 你的标签少了一个。您应该从 0 开始分配它们,而不是 1(或考虑到 的差异inputAccessoryViewDidSelectNext:)。如果您的代码正常工作,它将跳过 2 个文本字段,因为第一个字段将返回标签 1,您将跳到 objectAtIndex:2,这是第三个字段。
  3. 你不考虑结束。如果您在最后一个字段,递增将不会回到开头。

我实际上建议根本不使用标签。相反,在设置时,只需遍历字段,将它们添加到您的数组中。然后,在 中inputAccessoryViewDidSelectNext:,使用计数器而不是快速枚举来确定您的位置。

于 2012-11-02T14:52:57.580 回答
1

我建议不要使用任何数组来拥有 textFields,而是从 tableView 的单元格中获取 textFields。

你可以这样做,

使用它所在的单元格的 indexPath 设置您的 textFields 标记。

然后使用textFieldDidEnd委托,从标签中获取下一个文本字段的单元格,稍后从单元格获取文本字段并使其成为第一响应者。

如果您可以通过FDInputAccessoryView以下方法获取单元格,您也可以在此处进行操作。

- (void) inputAccessoryViewDidSelectNext:(FDInputAccessoryView *)view`
于 2012-11-02T14:57:03.147 回答
1

根据文档,“[Fast] 枚举是‘安全的’——枚举器有一个突变保护,因此如果您在枚举期间尝试修改集合,则会引发异常。” 这可能就是它不起作用的原因。你可以用一个普通的while循环来完成同样的事情。

于 2012-11-03T03:23:15.243 回答