NSMutableArray快速枚举问题



newbie obj-c问题。

我有一个带有四个自定义单元格的自定义表观视图。在每个单元格中,都是可编辑的Textfield,以获取客户信息。我需要通过输入附件视图来改进TextField之间的切换。http://uaimage.com/image/62f08045

我创建了一个具有容量的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;
}

现在,我尝试提高按钮" Next"的功能:

- (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中:,使用计数器而不是快速枚举来找出您的位置。

  1. 为什么要在textFieldShouldReturn:中设置textFieldsArray?难道不应该在完成初始化的地方(例如,视图控制器的viewDidLoad)吗?问题可能是您的数组永远不会真正设置,或者仅部分设置。此外,将设置放在这里意味着它会一遍又一遍地调用,每次都会突变您的数组并拧紧。
  2. 您的标签被一个关闭。您应该从0开始分配它们,而不是1(或考虑inputAccessoryViewDidSelectNext:中的差异)。如果您的代码正常工作,它将跳过2个文本字段,因为第一个字段将返回标签1,并且您会跳到ObjectatIndex:2,这是第三个字段。
  3. 您不考虑结束。如果您在最后一个字段,则递增将不会返回开始。

我实际上建议根本不使用标签。取而代之的是,在设置时,只需循环循环添加它们以按顺序添加到您的数组。然后,在inputAccessoryViewDidSelectNext:中,使用计数器代替快速枚举来找出您的位置。

我建议不要使用任何数组具有文本字段,而是从tableview的单元格中获取文本字段。

您可以这样做

用它的indexpath设置您的TextFields标签。

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

如果您可以在下面的方法中从FDInputAccessoryView获取单元格,也可以在这里进行。

- (void) inputAccessoryViewDidSelectNext:(FDInputAccessoryView *)view`

根据文档," [快速]枚举是"安全的" - 枚举者有一个突变保护罩,因此如果您试图在枚举过程中修改收集,则会提高例外。"这可能就是为什么它不起作用。

,您可能可以用普通的事情来完成同一件事。

最新更新