我有一个包含四个部分的tableview,第一部分有7行,其中前六行有一个文本字段,最后一行有两个文本字段

第一节

11
11
11
11
11
11
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节

11
11
11
11
11
11
11
11

第二和第三部分包含七行,每行有两个文本字段

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

在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);
        }
    }
}

最佳答案

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

原来是我的问题是,在我滚动UITableViewCells时,始终不断重新创建UITableView。我怀疑您的表格视图很长,因此它不能放在一个屏幕中,因此您无法摆脱滚动。我的UITextFields中也有UITableViewCells

在我的情况下,发生的事情是,一旦UITextViewCell从屏幕上消失了,它就被释放了(这种情况发生在您的情况下,因为您正在使用单元格标识符,我知道)。下次出现在屏幕上时,它将重新使用以前的文本字段及其文本和设置。

我最后要做的是检查单元格中UITextFields的创建量。现在,这些文件已创建一次,并且在UITableViewCell的整个过程中保持静态,也就是说,我不会在每次调用UITextFields时都重新创建cellForRowAtIndexPath

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

[UITableView cellForRowAtIndexPath:]

..和..
[UITableViewDelegate tableView: cellForRowAtIndexPath:]

...是两个不同的功能,行为各不相同。我打错电话了,后来我从[UIView viewWithTag:]中得到了零。

我的2欧分。

关于ios - Tableview [cell.contentview viewwithtag:]返回nil,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4053541/

10-10 20:51