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解决的一些想法:
- 为什么要在TextfieldShouldReturn中设置TextfieldSarray:?难道不应该在完成初始化的地方(例如,视图控制器的ViewDidload)吗?问题可能是您的数组永远不会真正设置,或者仅部分设置。此外,将设置放在这里意味着它会一遍又一遍地调用,每次都会突变您的数组并拧紧。
- 您的标签被一个关闭。您应该从0开始分配它们,而不是1(或考虑InputAccessoryViewDidSelectNext的差异::)。如果您的代码正常工作,它将跳过2个文本字段,因为第一个字段将返回标签1,并且您会跳到ObjectatIndex:2,这是第三个字段。
- 您不考虑结束。如果您在最后一个字段,则递增将不会返回开始。
我实际上建议根本不使用标签。取而代之的是,在设置时,只需循环循环添加它们以按顺序添加到您的数组。然后,在InputAccessoryViewDidSelectNext中:,使用计数器而不是快速枚举来找出您的位置。
- 为什么要在
textFieldShouldReturn:
中设置textFieldsArray
?难道不应该在完成初始化的地方(例如,视图控制器的viewDidLoad
)吗?问题可能是您的数组永远不会真正设置,或者仅部分设置。此外,将设置放在这里意味着它会一遍又一遍地调用,每次都会突变您的数组并拧紧。 - 您的标签被一个关闭。您应该从0开始分配它们,而不是1(或考虑
inputAccessoryViewDidSelectNext:
中的差异)。如果您的代码正常工作,它将跳过2个文本字段,因为第一个字段将返回标签1,并且您会跳到ObjectatIndex:2,这是第三个字段。 - 您不考虑结束。如果您在最后一个字段,则递增将不会返回开始。
我实际上建议根本不使用标签。取而代之的是,在设置时,只需循环循环添加它们以按顺序添加到您的数组。然后,在inputAccessoryViewDidSelectNext:
中,使用计数器代替快速枚举来找出您的位置。
我建议不要使用任何数组具有文本字段,而是从tableview的单元格中获取文本字段。
您可以这样做
用它的indexpath设置您的TextFields标签。
然后使用 textFieldDidEnd
委托,从标签中获取下一个textfield的单元格,从单元格获取文本字段并使其成为第一响应者。
如果您可以在下面的方法中从FDInputAccessoryView
获取单元格,也可以在这里进行。
- (void) inputAccessoryViewDidSelectNext:(FDInputAccessoryView *)view`
根据文档," [快速]枚举是"安全的" - 枚举者有一个突变保护罩,因此如果您试图在枚举过程中修改收集,则会提高例外。"这可能就是为什么它不起作用。