滚动时在UITableView中重复数据

时间:2013-07-04 10:09:27

标签: ios objective-c cocoa-touch uitableview

我使用波纹管代码在TableView上显示数据,但滚动时,数据重复和其他数据丢失。

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [FileCompletedArray count];

}

cellForRowatindexpath():

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

    static NSString *CellIdentifier = @"CellIdentifier";

    UITableViewCell *cell = [_tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil)
    {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];

        UILabel *FileNameLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 0, 100, 30)];
        FileNameLabel.backgroundColor = [UIColor clearColor];
        FileNameLabel.font = [UIFont fontWithName:@"Helvetica" size:16];
        FileNameLabel.font = [UIFont boldSystemFontOfSize:16];
        FileNameLabel.textColor = [UIColor blackColor];
        NSLog(@"Reseversed TEMP array %@",FileCompletedArray);
        FileNameLabel.text =[FileCompletedArray objectAtIndex:indexPath.row];
        [cell.contentView addSubview: FileNameLabel];
        [FileNameLabel release];



    }
        return cell;
}

你有解决方案吗?提前致谢

4 个答案:

答案 0 :(得分:3)

使用不同的单元格标识符

例如像贝娄......

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

    NSString *CellIdentifier = [NSString stringWithFormat:@"%d,%d",indexPath.section,indexPath.row];

    UITableViewCell *cell = [_tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil)
    {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
        /// write your code here..
    }
}

设置nil如下...

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

    //static NSString *CellIdentifier = @"CellIdentifier";    

    UITableViewCell *cell = [_tableView dequeueReusableCellWithIdentifier:nil];
    if (cell == nil)
    {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil] autorelease];
        /// write your code here..
    }
}

答案 1 :(得分:3)

生成此问题是因为您的UITableView重新使用Cell即时创建新的。 我给你一些可能对你有帮助的建议。

1)在

之间添加Controller
 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath   
  {
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil)
    {
        /// Your code of initialization of controller;
    }

    /// set property of controllers such like (Text UILabel, image of UIImageView...etc) .
 return cell;

}

1)将您的Controller添加到cell.contentView.

<强>编辑:

在您按照我的编辑答案之前,我想告诉您,以下代码对内存管理不利,因为它会为UITableView的每一行创建新单元格,所以请小心。

但如果适用于UITableView有限行(50-100可能),则使用以下代码会更好。

NSString *CellIdentifier = [NSString stringWithFormat:@"S%1dR%1d",indexPath.section,indexPath.row];
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if(cell == nil)
    {
          /// Your whole code of controllers;
    } 

答案 2 :(得分:2)

仅在创建新单元格时设置标签文本。但是,在单元重用期间,不会创建新单元。因此,您设置/更改文本的代码无效。您可以使用此修改后的代码。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

    static NSString *CellIdentifier = @"CellIdentifier";

    UITableViewCell *cell = [_tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    UILabel *FileNameLabel=nil;
    if (cell == nil)
    {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];

        FileNameLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 0, 100, 30)];
        FileNameLabel.tag = 1001;
        FileNameLabel.backgroundColor = [UIColor clearColor];
        FileNameLabel.font = [UIFont fontWithName:@"Helvetica" size:16];
        FileNameLabel.font = [UIFont boldSystemFontOfSize:16];
        FileNameLabel.textColor = [UIColor blackColor];
        [cell.contentView addSubview: FileNameLabel];
        [FileNameLabel release];
    }
    if(!FileNameLabel)
        FileNameLabel = [cell.contentView viewWithTag:1001];
    FileNameLabel.text =[FileCompletedArray objectAtIndex:indexPath.row];

    return cell;
}

或者,您可以使用默认textLabel,而不是创建和添加新标签

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"CellIdentifier";

    UITableViewCell *cell = [_tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    UILabel *FileNameLabel=nil;
    if (cell == nil)
    {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
        cell.textLabel.font = [UIFont fontWithName:@"Helvetica" size:16];
        cell.textLabel.font = [UIFont boldSystemFontOfSize:16];
        cell.textLabel.textColor = [UIColor blackColor];
    }
    cell.textLabel.text =[FileCompletedArray objectAtIndex:indexPath.row];

    return cell;
}

答案 3 :(得分:2)

我也面临同样的问题,当我们重用细胞时会出现问题。在重用时,数据已经存在于其中,我们还会编写更多数据,为了理清这一点,我对表视图委托方法cellForRowAtIndexPath进行了一些小改动。这里使用的代码总是使用表格视图。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
if (!cell) {
    cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"cell"];
}
for (UIView *view in cell.contentView.subviews) {
    [view removeFromSuperview];
}

return cell;

}

当我们重用一些单元格时执行for循环,它的作用是删除UITableViewCell中存在的所有先前数据

希望这会对某人有所帮助。