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

IOS:两个tableview的tableview委托方法

iOS tableview上textView在编辑状态时,tableview自动上移的功能

如何从 tableview 框架中调用 tableview 单元格单击事件?