在 UITableViewCells 中的 UITextFields 中维护文本
Posted
技术标签:
【中文标题】在 UITableViewCells 中的 UITextFields 中维护文本【英文标题】:Maintaining text in UITextFields in UITableViewCells 【发布时间】:2013-07-18 01:59:54 【问题描述】:我的问题:我有一个用于创建列表的 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;
【问题讨论】:
【参考方案1】:正如@Bruno 所说,您需要注意在单元初始化中放入的内容。一个好的一般规则是只将通用规则放入cell == nil
条件中。 任何取决于表格视图中单元格位置的内容都需要超出此if
语句。
在上面的代码中,您有一个注释“每种文本字段的自定义初始化”。这是一个很好的指标,表明此代码需要超出 if
语句。
其次,您不能依赖表格视图单元格来为您保留数据。如果您还没有,则需要保留一个字符串数组,代表文本字段区域中的每个条目。然后当表格视图要求一个单元格时,您可以根据其索引路径设置每个文本字段的文本在cell == nil
987654325@有条件。
也请查看this answer。
希望这会有所帮助!
【讨论】:
【参考方案2】:你的错误在
if (cell == nil)
部分代码。您没有考虑else
,这是重复使用单元格的情况。 (单元格被重复使用,这就是它出现在底部的原因)。
您应该确保您处理重用情况(换句话说,您在重用时相应地配置您的单元格)
【讨论】:
【参考方案3】:我发现了你的问题。不过有点难说。
试想一下,当表格视图要连续显示一个单元格时,它会在重用队列中选择一个与要显示的单元格类型相同的单元格。换句话说,表格视图只知道它选择的重用单元格的类型,并且单元格的注释由哪一行识别!所以让我们看看你的代码。
你可以知道你只用你的文本创建了一个单元格,当它是 nil 时。但是在使用的时候,同类型的单元格不知道自己在哪一行,也不知道自己的评论是什么,只显示最后的信息!!
这是解决方案。 尝试将您的信息保存在一个组织良好的数组中(例如:您可以通过它所在的行来支持您的信息),基于它的行,尝试通过它与信息数组相关的哪一行来更新您的单元格的注释。
希望能帮到你:)
【讨论】:
以上是关于在 UITableViewCells 中的 UITextFields 中维护文本的主要内容,如果未能解决你的问题,请参考以下文章
在 UITableViewCells 中的 UITextFields 中维护文本
一个NIB中的几个自定义UITableViewCells - 如何在代码中引用?
重新排序 CoreData 中的 UITableViewCells 和对象