NSMutableArray快速枚举问题

时间:2012-11-02 14:28:38

标签: iphone objective-c ios xcode fast-enumeration

新手obj-c问题。

我有一个带有四个自定义单元格的自定义tableview。在每个单元格中都有一个可编辑的文本字段用于客户信息。我需要通过Input Accessory View改进文本字段之间的切换。 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;
}

现在我尝试改进按钮“Next”的功能:

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

    }
}

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

有人可以帮忙吗? 谢谢,Alex。


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

  1. 为什么要在textFieldShouldReturn中设置textFieldsArray:?这不应该在初始化完成的地方完成(例如视图控制器的viewDidLoad)?问题可能是您的阵列从未实际设置过,或者只是部分设置。此外,将设置置于此处意味着它将被反复调用,每次都会改变阵列并搞砸了。
  2. 你的标签是一个人。您应该从0开始分配它们,而不是1(或者考虑inputAccessoryViewDidSelectNext :)的差异。如果您的代码正常工作,它将跳过2个文本字段,因为第一个字段将返回标记1,并且您将跳转到objectAtIndex:2,这是第3个字段。
  3. 你没有考虑到最后的结果。如果你在最后一个字段,增量将不会回到开头。
  4. 我实际上建议不要使用标签。相反,在设置时,只需循环遍历字段,将它们添加到阵列中。然后,在inputAccessoryViewDidSelectNext:中,使用计数器而不是快速枚举来确定你的位置。

3 个答案:

答案 0 :(得分:3)

  1. 为什么要在textFieldsArray设置textFieldShouldReturn:?这不应该在初始化完成的地方完成(例如视图控制器的viewDidLoad)?问题可能是您的阵列从未实际设置过,或者只是部分设置。此外,将设置置于此处意味着它将被反复调用,每次都会改变阵列并搞砸了。
  2. 你的标签是一个人。你应该从0开始,而不是1(或考虑inputAccessoryViewDidSelectNext:的差异)来分配它们。如果您的代码正常工作,它将跳过2个文本字段,因为第一个字段将返回标记1,并且您将跳转到objectAtIndex:2,这是第3个字段。
  3. 你没有考虑到最后的结果。如果你在最后一个字段,增量将不会回到开头。
  4. 我实际上建议不要使用标签。相反,在设置时,只需循环遍历字段,将它们添加到阵列中。然后,在inputAccessoryViewDidSelectNext:中,使用计数器而不是快速枚举来确定您的位置。

答案 1 :(得分:1)

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

你可以这样做,

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

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

如果您可以通过以下方法从FDInputAccessoryView获取单元格,也可以在此处执行..

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

答案 2 :(得分:1)

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