当调用 textFieldDidEndEditing 时,应用程序冻结
When textFieldDidEndEditing gets called, the app freezes
我有一个定制的 UITableView
,里面有 UITextFields
。在 cellForRow...
中,我将 textFields
委托给了自己。 (在我的主 VC class 中。)我从 textField
获取文本的方式是在 textFieldDidEndEditing
,然后我将它添加到 mutableArray
。
然后我有不同的单元格 ID,这些单元格 ID 在选择按钮时被添加:
- (IBAction)addRow:(id)sender
{
NSInteger row = [self.rowArray cound];
[self.rowArray insertObject:@"anotherCell" atIndex:row];
NSIndexPath *indexPath = [NSindexPath indexPathForRow:row inSection:0];
[self.myTableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
}
(那个cellID
里面有一个textField
,我把delegate
设置为自己。)
在 textFieldDidEndEditing
中,我创建了 textField.text
的 NSLog
,当从最初存在的 textField
调用该方法时,它按预期工作。
但是当 textFieldDidEndEditing
从 anotherCell
单元格(添加的单元格)中的 textField
调用时,整个模拟器会冻结。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString *cellID = [self.rowArray objectAtIndex:[indexPath row]];
customCell *cell = [tableView dequeuereusablecellwithidentifier:cellID forIndexPath:indexPath];
cell.name.delegate = self; // From cell that is initially there
cell.phoneNumber.delegate = self; // From the added cell
return cell;
}
(如果这令人困惑,或者如果您需要更多代码,请在评论中告诉我。谢谢)
编辑
- (void)textFieldDidEndEditing:(UITextField *)textField
{
if (textField.tag <= 9)
{
NSLog(@"%@", textField.text); // This works
}
UIView *superview = textField.superview;
while (![superview isMemberOfClass:[UITableViewCell class]]) {
superview = superview.superview;
}
CustomCellClass *cell = (CustomCellClass *)superview;
NSIndexPath *indexPath = [self.myTableView indexPathForCell:cell];
if (textField.tag >= 12)
{
if ([self.inputArray count] > indexPath.row) // So I won't get the error message of [__NSArrayM objectAtIndex:]: index 1 beyond bounds for empty array'
{
for (NSUInteger i = [self.inputArray count]; i < indexPath.row; i++) {
[self.inputArray insertObject:@"" atIndex:i];
NSLog(@"%lu", (unsigned long)i);
}
}
NSLog(@"%@", self.inputArray);
}
}
您的代码在这里陷入了无限循环:
while (![superview isMemberOfClass:[UITableViewCell class]]) {
superview = superview.superview;
}
因为 isMemberOfClass
只有当父视图 class 是 UITableViewCell
时才会 return 为真,但如果它是 sub[=23= 则不会] 个 UITableViewCell
。如果将 isMemberOfClass
更改为 isKindOfClass
,它应该可以工作。查看 Apple 文档 here.
我有一个定制的 UITableView
,里面有 UITextFields
。在 cellForRow...
中,我将 textFields
委托给了自己。 (在我的主 VC class 中。)我从 textField
获取文本的方式是在 textFieldDidEndEditing
,然后我将它添加到 mutableArray
。
然后我有不同的单元格 ID,这些单元格 ID 在选择按钮时被添加:
- (IBAction)addRow:(id)sender
{
NSInteger row = [self.rowArray cound];
[self.rowArray insertObject:@"anotherCell" atIndex:row];
NSIndexPath *indexPath = [NSindexPath indexPathForRow:row inSection:0];
[self.myTableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
}
(那个cellID
里面有一个textField
,我把delegate
设置为自己。)
在 textFieldDidEndEditing
中,我创建了 textField.text
的 NSLog
,当从最初存在的 textField
调用该方法时,它按预期工作。
但是当 textFieldDidEndEditing
从 anotherCell
单元格(添加的单元格)中的 textField
调用时,整个模拟器会冻结。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString *cellID = [self.rowArray objectAtIndex:[indexPath row]];
customCell *cell = [tableView dequeuereusablecellwithidentifier:cellID forIndexPath:indexPath];
cell.name.delegate = self; // From cell that is initially there
cell.phoneNumber.delegate = self; // From the added cell
return cell;
}
(如果这令人困惑,或者如果您需要更多代码,请在评论中告诉我。谢谢)
编辑
- (void)textFieldDidEndEditing:(UITextField *)textField
{
if (textField.tag <= 9)
{
NSLog(@"%@", textField.text); // This works
}
UIView *superview = textField.superview;
while (![superview isMemberOfClass:[UITableViewCell class]]) {
superview = superview.superview;
}
CustomCellClass *cell = (CustomCellClass *)superview;
NSIndexPath *indexPath = [self.myTableView indexPathForCell:cell];
if (textField.tag >= 12)
{
if ([self.inputArray count] > indexPath.row) // So I won't get the error message of [__NSArrayM objectAtIndex:]: index 1 beyond bounds for empty array'
{
for (NSUInteger i = [self.inputArray count]; i < indexPath.row; i++) {
[self.inputArray insertObject:@"" atIndex:i];
NSLog(@"%lu", (unsigned long)i);
}
}
NSLog(@"%@", self.inputArray);
}
}
您的代码在这里陷入了无限循环:
while (![superview isMemberOfClass:[UITableViewCell class]]) {
superview = superview.superview;
}
因为 isMemberOfClass
只有当父视图 class 是 UITableViewCell
时才会 return 为真,但如果它是 sub[=23= 则不会] 个 UITableViewCell
。如果将 isMemberOfClass
更改为 isKindOfClass
,它应该可以工作。查看 Apple 文档 here.