2012-11-02 137 views
1

新手obj-c问题。NSMutableArray快速枚举问题

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

我创建一个NSMutableArray与容量4.我标记文本字段和添加他们此数组中的文本字段的委托方法中:

- (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-了解决:

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

我实际上建议不要使用标签。相反,在安装时,只需循环添加它们到数组中的字段即可。然后,在inputAccessoryViewDidSelectNext :,使用计数器而不是快速枚举来确定你在哪里。

+1

1.不要分配或变异你正在枚举的对象,所以创建一个新的文本字段对象(当引用objectAtIndex时:textField.tag + 1) 2.尝试先退出当前文本字段的第一个响应者然后在第一响应者 – MCKapur

+2

上进行下一步检查并确保已正确实例化textFieldArray并将其保留。使用NSLog来查看数组是否真的包含某些东西。 – Sandeep

+1

insertObject:atIndex:可能是一个问题,我试图使用一次,没有工作......事实证明,在插入它之前你需要在该索引处已经有一个对象....所以尝试添加对象而不是像这个:addObject: – MCKapur

回答

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

我实际上建议不要使用标签。相反,在安装时,只需循环添加它们到数组中的字段即可。然后,在inputAccessoryViewDidSelectNext:中,使用计数器而不是快速枚举来确定您的位置。

+0

非常有用的答案!非常感谢你!我会尽力改善你的建议,并会在这里写下关于 – Alex

+0

+1的结果。我想你已经明白了。 #1是答案。而#2是非常真实的。 #3是可选的,如果用户想要对最后一个文本字段的textFieldShouldReturn执行其他操作,则可能不需要。 – iDev

1

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

你可以这样做,

与细胞的indexPath在其中设置你的文本框的标签。

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

如果你可以从FDInputAccessoryView以下方法得到的细胞,你也可以做到这一点在这里..

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

“get”textFields是什么意思? – Alex

+1

我的意思是,而不是维护数组中的文本字段并从中获取文本字段实例,直接从单元格获取它.. – vishy

1

根据该文件,“[快]枚举是‘安全的’诚枚举有这样如果你在枚举过程中尝试修改这个集合,就会引发异常。“这可能是为什么它不起作用。你可以用普通的while循环完成同样的事情。