Tableview [cell.contentview viewwithtag:]返回nil

时间:2010-10-29 15:49:20

标签: ios objective-c iphone uitableview

我有一个包含四个部分的tableview,第一部分有7行,前六行有一个textfield,最后一行有两个textfields

第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

第4节

T1
T1
T1
T1
T1
T1
T1
t1

第二&第三部分包含七行,每行有两个文本域

第四部分有八行,每行包含一个文本字段我已为所有文本字段分配了唯一标记

在textFieldDidEndEditing中我将内容保存到适当索引中的数组。

如果我在文本字段中输入数据后滚动tableview。一些文本字段位置被更改(即)第二行中的文本字段放在第三行中,类似地交换了一些行。

我为第一部分的前六行创建了一个单元格标识符,第一部分的最后一行创建了第二个,其他部分的剩余三个单元格标识符。

当我滚动一些时间时,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);
        }
    }
}

3 个答案:

答案 0 :(得分:3)

我遇到了同样的问题(这里和那里出现奇怪的文字,文本字段交换内容和所有内容)。

结果是我的问题是我一直在UITableViewCells滚动UITableView时不断重新创建UITextFields。我怀疑你的桌面视图很长,所以它不适合一个屏幕,所以你无法摆脱滚动。我的UITableViewCells中也有UITextViewCell

在我的案例中发生的事情是,一旦UITextFields从屏幕上消失,它就会被解除分配(这种情况发生在您的情况下,因为您正在使用单元格标识符,我看到了)。下次它出现在屏幕上时,它会重复使用之前的文本字段及其文本和设置。

我最终做的是检查单元格中UITableViewCell的创建量。这些现在是在ONCE创建的,它们在UITextFields期间保持静态,也就是说,每次调用cellForRowAtIndexPath时我都不会重新创建[UITableView cellForRowAtIndexPath:]

我认为你应该注意的另一个问题是:

[UITableViewDelegate tableView: cellForRowAtIndexPath:]

.. ..和

[UIView viewWithTag:]

...是两种不同的功能,表现不同。我打电话给错了,后来{{1}}给了我一个零......

只是我的2欧元。

答案 1 :(得分:1)

我建议您编写一个方法来获取基于indexPath的文本索引...您可能在对象设置和获取之间存在错误。另外......我不会用这样的疯狂查找来使用数组。您应该使用带有键=“{section} _ {row}”的NSDictionary或类似的东西。

对于快速调试,我建议在数组中放置断点并查看数组中的内容,您可以在控制台中使用po textFieldArray执行此操作。

答案 2 :(得分:0)

可能是您已将子视图添加到单元格视图(带标记) - 并且正在子视图 > Cell的内容视图(带标签)。这是我的问题,我解决了。