我有一个tableView,其中包含一个UITextField作为每个单元格的子视图。我的问题是,当我向下滚动时,第一个单元格中的文本在最后一个单元格中重复。如果我找出原因,我就无法生活。我已经尝试从不同的笔尖加载单元格,将textFields作为ivars。 UITextFields似乎不是问题,我认为它与tableView重用单元格有关。
textFields都有一个数据源,可以跟踪textField中的文本,每次显示单元格时都会重置文本。
有什么想法吗?我真的很感激这个问题的更多答案。
更新2: 这是我为自定义单元格编写的代码,名为JournalCell。非常感谢您的反馈。
我有8个部分,每个部分有1行。前7个中有一个textField,最后一个是一个像按钮一样的单元格。
我正在测试按钮单元格,如果它与部分(7)匹配,则返回该单元格,如果没有,则继续其余部分。这可能是吗?
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
NSLog(@"Section %i, Row %i", indexPath.section, indexPath.row);
if (indexPath.section == 7) {
static NSString *ButtonCellIdentifier = @"ButtonCellIdentifier";
UITableViewCell *buttonCell = [self.tableView dequeueReusableCellWithIdentifier:ButtonCellIdentifier];
if (buttonCell == nil) {
buttonCell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ButtonCellIdentifier] autorelease];
buttonCell.selectionStyle = UITableViewCellSelectionStyleBlue;
buttonCell.accessoryType = UITableViewCellAccessoryNone;
buttonCell.textLabel.text = sClearAll;
buttonCell.textLabel.textAlignment = UITextAlignmentCenter;
buttonCell.backgroundColor = [UIColor colorWithWhite:1.0 alpha:0.8];
buttonCell.textLabel.backgroundColor = [UIColor clearColor];
}
return buttonCell;
}
static NSString *TextCellIdentifier = @"JournalCellIdentifier";
JournalCell *cell = (JournalCell *)[self.tableView dequeueReusableCellWithIdentifier:TextCellIdentifier];
if (cell == nil) {
[[NSBundle mainBundle] loadNibNamed:@"JournalCell" owner:self options:nil];
cell = customCell;
cell.selectionStyle = UITableViewCellSelectionStyleNone;
cell.accessoryType = UITableViewCellAccessoryNone;
cell.textField.autocapitalizationType = UITextAutocapitalizationTypeWords;
cell.textField.returnKeyType = UIReturnKeyNext;
cell.textField.clearButtonMode = UITextFieldViewModeWhileEditing;
}
switch (indexPath.section) {
case 0:
switch (indexPath.row) {
case 0:
cell.textField.autocapitalizationType = UITextAutocapitalizationTypeNone;
self.authorTextField = cell.textField;
self.authorTextField.text = [self.textFieldDictionary objectForKey:@"author"];
NSLog(@"Reading Author:%@", [self.textFieldDictionary objectForKey:@"author"]);
break;
}
break;
case 1:
switch (indexPath.row) {
case 0:
self.yearTextField = cell.textField;
self.yearTextField.text = [self.textFieldDictionary objectForKey:@"year"];
NSLog(@"Reading Year:%@", [self.textFieldDictionary objectForKey:@"year"]);
break;
}
break;
case 2:
switch (indexPath.row) {
case 0:
self.volumeTextField = cell.textField;
self.volumeTextField.text = [self.textFieldDictionary objectForKey:@"volume"];
NSLog(@"Reading Volume:%@", [self.textFieldDictionary objectForKey:@"volume"]);
break;
}
break;
case 3:
switch (indexPath.row) {
case 0:
self.articleTextField = cell.textField;
self.articleTextField.text = [self.textFieldDictionary objectForKey:@"article"];
NSLog(@"Reading Article:%@", [self.textFieldDictionary objectForKey:@"article"]);
break;
}
break;
default:
break;
}
return cell;
}
答案 0 :(得分:4)
正如您所猜测的,问题很可能来自UITableView中传统的单元重用。创建一个NSMutableDictionary作为类的属性,每当UITextField完成编辑时,将其值设置为字典中的键。
然后,在您的cellForRowAtIndexPath
方法中,在字典中加载相应键的值。
最理想的是使用格式[indexPath section], [indexPath row]
为词典中的每个键命名,因为这有助于设置和获取值。
希望这有帮助。
答案 1 :(得分:2)
Canada Dev的回答可能会解决您的问题,但它只是一个止损而不是长期修复。
您应该避免在cellForRowAtIndexPath:方法中添加子视图。
您应该创建一个自定义UITableViewCell(通常通过子类化UITableViewCell)并使用它 - 否则,只要它们出列,您就会从单元格中添加/删除子视图。
如果你不确定细胞的出列实际意味着什么,你应该阅读Apple的TableView文档。基本上,使用UITableViewCell子类,与在cellForRow方法中添加所有视图相比,您将处于更好的位置。
答案 2 :(得分:2)
您真的需要将每个单元格textField
保存到viewController
,然后通过插入其他单元格中的部分来生成单元格吗?
也许您可以将整个单元格保存在属性中(例如self.authorCell
),然后只显示此单元格:
if (indexPath.section == 0) {
return self.authorCell; // or cell = self.authorCell
}
您仍然可以通过访问单元格属性来访问textField
:
self.authorCell.myTextField
//编辑:请参阅Apple documentation获取“静态行内容技术”
答案 3 :(得分:0)
在分配单元格之后和执行任何绘图/标记/等之前尝试插入此权利。
cell.clearsContextBeforeDrawing = YES;
cell.textLabel.text = nil;
cell.detailTextLabel.text = nil;
for (UIView *view in cell.contentView.subviews) {
[view removeFromSuperview];
}