UITableView自定义视图和“加载更多”在同一单元格中

时间:2012-02-21 01:52:07

标签: iphone objective-c ios

我有自定义视图的UITableView。 对于tableview的底部,我在那里添加了一个“Load More”单元格。 单击后,tableview会成功加载更多数据,并且“加载更多”单元格仍位于tableview的底部。 但是,在我单击第一个“加载更多”后,出现第二个“加载更多”,并且自定义视图仍然存在于第二个“加载更多”的同一单元格中。 “加载更多”和自定义视图位于同一单元格上。我希望该单元格只显示“加载更多”。

第三个,第四个“加载更多”存在此问题。 任何人都可以帮助我吗?

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
        return imageCurPos+1;
}
- (UITableViewCell *)tableView:(UITableView *)aTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if([aTableView tag]==501){ 
        // Main Table
        static NSString *CellIdentifier = @"Cell";
        UITableViewCell *cell = [aTableView dequeueReusableCellWithIdentifier:CellIdentifier];
        [[cell viewWithTag:3007] removeFromSuperview];

        const NSInteger BOTTOM_LABEL_TAG = 3002;
        UIImageView *bottomLabel;
        UILabel *loadMore;


        if(indexPath.row < imageCurPos){
        if (cell == nil)
        { //All repeat things come here, if don't want to repeat here, please state outside this brucket
            cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
        }

//Edited
for (UIView *view in [cell.contentView subviews]) 
    {
        [view removeFromSuperview];
    }


            bottomLabel = [[[UIImageView alloc] initWithFrame: CGRectMake(50, 30, 250, 112)] autorelease];
            [cell.contentView addSubview:bottomLabel];

            bottomLabel.tag = BOTTOM_LABEL_TAG;

            cell.backgroundView =
            [[[UIImageView alloc] init] autorelease];
            cell.selectedBackgroundView =
            [[[UIImageView alloc] init] autorelease];

        UIImageView *iconView = [[[UIImageView alloc] initWithFrame:CGRectMake(0, 30, 45, 45)] autorelease];
        iconView.image = [UIImage imageNamed:@"02_bubble.png"];
        [[cell contentView] addSubview:iconView];

        bottomLabel.image = [UIImage imageNamed:@"05_bubble.png"];

        }else if(indexPath.row == imageCurPos ){ //For Load More
            if (cell == nil)
            { //All repeat things come here, if don't want to repeat here, please state outside this brucket
                cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
            }  

//Edited
for (UIView *view in [cell.contentView subviews]) 
    {
        [view removeFromSuperview];
    }


                loadMore =
                [[[UILabel alloc]
                  initWithFrame:
                  CGRectMake( 0, 0, 300, 50)]
                 autorelease];

                loadMore.text = @"Load more...";
                loadMore.textAlignment = UITextAlignmentCenter;

                loadMore.tag = 3007;

                loadMore.textColor = [UIColor whiteColor];
                loadMore.backgroundColor = [UIColor darkTextColor];
                [cell.contentView addSubview:loadMore];            
        }
        return cell;     
    }
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *) indexPath{
if([tableView tag]==501){
        if([indexPath row] != imageCurPos){

        }else{ // For load more

            NSLog(@"noRow Prev: %d", imageCurPos);
            imageCurPos += interval;
            NSLog(@"noRow After: %d", imageCurPos);

            [tbl_mo_main reloadData];   
        }
}

2 个答案:

答案 0 :(得分:2)

我认为你应该使用2个不同的标识符,一个用于普通单元格,一个用于加载更多单元格。

有一点是创建自定义单元格应该在块中完成。

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

    //  create the views in side the cell and add it
    ...
}

然后在此块之外,更新单元格。 您可以在创建单元格时为视图设置标记,并通过[cell.contentView viewWithTag:tag]

更新相应的视图

您可以参考此主题:Reload TableViewCell's UILabels in dynamic table

答案 1 :(得分:0)

        [cell.contentView addSubview:loadMore];            

此行将标签添加到单元格内容视图,但是当重复使用该单元格时..该单元格中仍然存在该标签。

在if和else中if(cell == nil)之后添加以下代码以进行索引路径检查。

 for (UIView *view in [cell.contentView subviews]) 
    {
        [view removeFromSuperview];
    }