Tableview [cell.contentview viewwithtag:] 返回 nil
Posted
技术标签:
【中文标题】Tableview [cell.contentview viewwithtag:] 返回 nil【英文标题】:Tableview [cell.contentview viewwithtag:] is returning nil 【发布时间】:2010-10-29 15:49:19 【问题描述】:我有一个包含四个部分的表格视图,第一部分有 7 行,前六行有一个文本字段,最后一行有两个文本字段
第 1 节
t1 t1 t1 t1 t1 t1 t1 t2
第 2 节
t1 t2 t1 t2 // 第二行文本字段放在第四行 t1 t2 t1 t2 // 第四行文本字段被放置在其他行中 t1 t2 t1 t2 t1 t2
第 3 节
t1 t2 t1 t2 t1 t2 t1 t2 t1 t2 t1 t2 t1 t2 第四节
t1 t1 t1 t1 t1 t1 t1 t1
第二和第三部分包含七行,每行有两个文本字段
第四部分有八行,每行包含一个文本字段我为所有文本字段分配了唯一标签
在 textFieldDidEndEditing 中,我将内容保存到适当索引的数组中。
如果我在文本字段中输入数据后滚动表格视图。一些文本字段的位置发生了变化(即)第二行中的文本字段被放置在第三行中,同样一些行被交换了。
我创建了 5 个单元格标识符,一个用于第一部分的前六行,第二个用于第一部分的最后一行,其余三个用于其他部分的单元格标识符。
当我滚动某些时候 cell.contentview viewWithtag 返回标签的 nil 值
我认为这是某些行中文本字段错误的原因。
如何解决这个问题?
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
NSString *identifier;<bn>
UITableViewCellStyle style = UITableViewCellStyleDefault;<br>
BOOL selectable = NO;<br>
switch (indexPath.section)
case 0:
if(indexPath.row < 6)
identifier = @"firstsectionSixRows";
else
identifier = @"firstsectionLastRow";
break;
case 1:
identifier = @"secondsection";
break;
case 2:
identifier = @"thirdsection";
break;
case 3:
identifier = @"fourthsection";
break;
return [self createCellForIdentifier:identifier
tableView:tableView
indexPath:indexPath
style:style
selectable:selectable];
在 createCellForIdentifier 方法中
else if([identifier isEqualToString:@"secondsection"])
int TextTag = 8 + indexPath.row * 2;
UILabel *lblName = (UILabel*)[cell.contentView viewWithTag:10000];
lblName.text = [NSString stringWithFormat:@"G%d",indexPath.row + 1];
//NSLog(@"row = %d texttag = %d",indexPath.row,TextTag);
UITextField *txtFirst = (UITextField*) [cell.contentView viewWithTag:TextTag];
if([textFieldArray count] > 0)
if(![[textFieldArray objectAtIndex:TextTag] isEqualToString:@""])
if(txtFirst)
txtFirst.text = [NSString stringWithFormat:@"%@",[textFieldArray objectAtIndex:TextTag]];
else
NSLog(@"Textfield is nil \n tag = %d \n cell section = %d row = %d",TextTag,indexPath.section,indexPath.row);
UITextField *txtSecond = (UITextField*) [cell.contentView viewWithTag:TextTag + 1];
if([textFieldArray count] > 0)
if(![[textFieldArray objectAtIndex:TextTag + 1] isEqualToString:@""])
if(txtSecond)
txtSecond.text = [NSString stringWithFormat:@"%@",[textFieldArray objectAtIndex:TextTag + 1]];
else
NSLog(@"Textfield is nil \n tag = %d \n cell section = %d row = %d",TextTag + 1,indexPath.section,indexPath.row);
【问题讨论】:
【参考方案1】:我遇到了同样的问题(奇怪的文字出现在这里和那里,文本字段交换内容等等)。
原来是我的问题是我一直在滚动UITableView
时不断地重新创建UITableViewCells
。我怀疑你的表格视图很长,所以它不适合一个屏幕,所以你不能摆脱滚动。我的UITableViewCells
中也有UITextFields
。
在我的情况下发生的事情是,一旦 UITextViewCell
从屏幕上消失,它就会被释放(这发生在你的情况下,因为你使用的是单元格标识符,我明白了)。下次它出现在屏幕上时,它将重新使用以前的文本字段及其文本和设置。
我最终做的是检查单元格中UITextFields
的创建量。这些现在创建一次,并且在 UITableViewCell
的持续时间内保持静态,也就是说,我不会在每次调用 cellForRowAtIndexPath
时重新创建 UITextFields
。
我认为您应该注意的另一个问题是:
[UITableView cellForRowAtIndexPath:]
..和..
[UITableViewDelegate tableView: cellForRowAtIndexPath:]
...是两个不同的函数,行为不同。我打错了,后来[UIView viewWithTag:]
给了我一个零...
只要我的 2 欧分。
【讨论】:
【参考方案2】:我建议您编写一个方法来根据 indexPath 获取文本的索引...您可能在对象的设置和获取之间有错误。另外...我不会为此使用数组进行疯狂的查找。您可能应该使用带有 key = "section_row" 或类似内容的 NSDictionary。
为了快速调试,我建议在你的数组中放置一个断点,你可以在控制台中使用po textFieldArray
来做到这一点。
【讨论】:
我无法获得该行中该标签的确切文本字段。当我打印单元格子视图时,具有不同标签的文本字段位于该单元格内,因此 [cell.content viewfortag:TextTag] 返回 nil 【参考方案3】:可能是您已将 Subview 添加到 Cell view(带有标签) - 并且正在 中寻找 Subviews >Cell 的内容视图(带有标签)。这是我的问题,我解决了。
【讨论】:
以上是关于Tableview [cell.contentview viewwithtag:] 返回 nil的主要内容,如果未能解决你的问题,请参考以下文章
TableView里面的tableview cell swift 3
将 tapGesture 添加到 tableView 则无法执行 tableView(_ tableView: UITableView, didSelectRowAt indexPath: Index
Swift:tableView 行的高度,其 tableView 单元格具有动态行数的嵌套 tableView