我的问题:我有一个用于创建列表的UITableView部分。每个TableViewCell都包含UITextField。当您开始键入文本字段时,将插入一个新单元格。所有这些功能都非常有效。但是,如果用户创建了许多单元格,它们会离开屏幕并出现问题。特别是该部分顶部的单元格开始被重用。这会导致新单元格中出现不需要的文本,并删除旧单元格中的文本。我该如何解决这个问题?
此问题的图片: (在第二张图片中,当我开始输入第6项时,第1项出现在其下方)
创建UITableViewCells的代码:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"AddListInformationCellid";
UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
// Intialize TableView Cell
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:CellIdentifier];
cell.accessoryType = UITableViewCellAccessoryNone;
cell.selectionStyle = UITableViewCellSelectionStyleNone;
cell.backgroundColor = [UIColor whiteColor];
// Initialize TextField
// ... code ommitted for brevity
// Custome intializiation per each kind of TextField
if (indexPath.section == 0) {
playerTextField.tag = 0;
playerTextField.placeholder = @"Title";
}
else if (indexPath.section == 1) {
// Here's where the problem starts *********
playerTextField.tag = indexPath.row + 1;
playerTextField.placeholder = @"List Item";
}
[cell.contentView addSubview:playerTextField];
}
return cell;
}
添加/删除单元格的代码
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
NSInteger section = [self.tableView indexPathForCell:(UITableViewCell *)textField.superview.superview].section;
NSInteger row = [self.tableView indexPathForCell:(UITableViewCell *)textField.superview.superview].row;
if (section == 0) {
_myList.name = textField.text;
}
else if (section == 1) {
// Delete cell that is no longer used
if ([string isEqualToString:@""]) {
if (textField.text.length == 1) {
if (cellCount > 1) {
cellCount = cellCount - 1;
[self.tableView deleteRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:row inSection:1]] withRowAnimation:UITableViewRowAnimationAutomatic];
textField.text = @"";
}
}
}
// Add a new cell
if (self.beganEditing) {
if (![string isEqualToString:@""]) {
if (row == [self.tableView numberOfRowsInSection:1] - 1) {
cellCount = cellCount + 1;
[self.tableView insertRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:row + 1 inSection:1]] withRowAnimation:UITableViewRowAnimationAutomatic];
self.beganEditing = NO;
}
}
}
}
return YES;
}
答案 0 :(得分:4)
正如@Bruno所说,你需要观察你在细胞初始化中投入的内容。一个好的一般规则是只将通用规则放入cell == nil
条件。 任何取决于表格视图中单元格位置的内容都需要超出此if
声明。
在上面的代码中,您有一条评论“每种文本字段的自定义初始化”。这是一个非常好的指标,表明此代码需要超出if
语句。
其次,您不能依靠表格查看单元格来保存您的数据。如果您还没有,则需要保留一个字符串数组,表示文本字段区域中的每个条目。然后,当通过表格视图询问单元格时,您可以根据 cell == nil
条件之外的索引路径设置每个文本字段的文本。
同时查看this answer。
希望这有帮助!
答案 1 :(得分:3)
你的错误就在
上if (cell == nil)
您的部分代码。你没有考虑else
,这是重复使用单元格的情况。 (细胞被重复使用,这就是为什么它出现在底部)。
你应该确保你处理重用案例(换句话说,你重复使用时配置你的单元格)
答案 2 :(得分:1)
我找到了你的问题。但这有点难以说清楚。
尝试考虑一下,当表视图要在一行中呈现一个单元格时,它将在重用队列中选择一个与将要显示的单元格相同的单元格。换句话说,表视图只知道它选择的重用单元的类型,并且单元的注释被哪一行识别!所以,让我们看看您的代码。
您可以知道,只有nil时,您才会使用您的文本创建一个单元格。然而,当它将被使用时,具有相同类型的单元格不知道它在哪一行,因此它不知道它所持有的是什么类型的注释,并且只是呈现了它的最后一次信息!/ p>
这是解决方案。 尝试将您的信息保存在一个组织良好的数组中(例如:您可以通过其中的哪一行返回您的信息),基本在其行上,尝试更新您的单元格的注释,其中哪一行与info-array相关。
希望它可以提供帮助:)