新手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解决的一些想法:
我实际上建议不要使用标签。相反,在设置时,只需循环遍历字段,将它们添加到阵列中。然后,在inputAccessoryViewDidSelectNext:中,使用计数器而不是快速枚举来确定你的位置。
答案 0 :(得分:3)
textFieldsArray
设置textFieldShouldReturn:
?这不应该在初始化完成的地方完成(例如视图控制器的viewDidLoad
)?问题可能是您的阵列从未实际设置过,或者只是部分设置。此外,将设置置于此处意味着它将被反复调用,每次都会改变阵列并搞砸了。inputAccessoryViewDidSelectNext:
的差异)来分配它们。如果您的代码正常工作,它将跳过2个文本字段,因为第一个字段将返回标记1,并且您将跳转到objectAtIndex:2,这是第3个字段。我实际上建议不要使用标签。相反,在设置时,只需循环遍历字段,将它们添加到阵列中。然后,在inputAccessoryViewDidSelectNext:
中,使用计数器而不是快速枚举来确定您的位置。
答案 1 :(得分:1)
我建议不要使用任何数组来使用textFields,而是从tableView的单元格中获取textFields。
你可以这样做,
使用其所在的单元格的indexPath设置textFields标记。
然后使用textFieldDidEnd
委托,从标签中获取下一个文本字段的单元格,稍后从单元格获取文本字段并使其成为第一个响应者。
如果您可以通过以下方法从FDInputAccessoryView
获取单元格,也可以在此处执行..
- (void) inputAccessoryViewDidSelectNext:(FDInputAccessoryView *)view`
答案 2 :(得分:1)
根据文档,“[Fast]枚举是”安全的“ - 枚举器具有变异防护,因此如果您在枚举期间尝试修改集合,则会引发异常。”这可能是它不起作用的原因。你可以用普通的while循环完成同样的事情。