tableview:删除行时数据重叠

时间:2011-12-28 09:53:40

标签: iphone objective-c ios cocoa-touch uitableview

在我的iPhone应用程序中......

在表格视图中,我删除了行...

更新我正在喂食桌子的阵列......

重新加载到数据行......

enter image description here

X

是,但删除的数据是正确的..

索引路径行的单元格....

我刚刚在行中添加了一个标签...... 删除行

我只是从数组中删除数据

并更新行数(递减)......

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

            UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
            if (cell == nil) {
                cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] autorelease];
            }


            //Get the Log Id for the sections. From Section Array
            int logID=0;
            if(indexPath.row==0)
            {
                NSLog(@"Time Array %@",timeArray);
                  logID=[[[sectionArray objectAtIndex:indexPath.section] valueForKey:@"logID"] intValue];
                  NSPredicate *p=[NSPredicate predicateWithFormat:@"logID==%d",logID];
                  fillRows=nil;
                  fillRows= [[timeArray filteredArrayUsingPredicate:p] mutableCopy];
            }

        //Show Current Time.
        //"If condition for not to go for Array Index Out of Bound".
        if(indexPath.row<[fillRows count])
        {
        //Log CurrentTime    
            cell.textLabel.text=[[fillRows objectAtIndex:indexPath.row] valueForKey:@"logCurrentTime"];
        //Log Duration.   
            UILabel *lblDuration=[[[UILabel alloc] initWithFrame:CGRectMake(110, 11, 60, 21)] autorelease] ;

      lblDuration.text=[[fillRows objectAtIndex:indexPath.row] valueForKey:@"logDuration"];
            [cell.contentView addSubview:lblDuration];
        }

            return cell;
        }

编辑::重叠标签的问题已被彻底解决。 因为现在标签没有重叠但是 当我删除任何行时,那些行的标签保持不变 ---&GT;最后一行未显示在表格中。

See this link Answer

3 个答案:

答案 0 :(得分:1)

问题是每次绘制单元格时都会向单元格添加新标签。

尝试将以下代码移到if (cell == nil) {..} block

UILabel *lblDuration=[[[UILabel alloc] initWithFrame:CGRectMake(110, 11, 60, 21)] autorelease] ;
[cell.contentView addSubview:lblDuration];

答案 1 :(得分:1)

这是因为dequeueReusableCellWithIdentifier会返回您之前调用cellForRow...委托创建的未使用的单元格。如果要向单元格添加标签,则应在单元格init之后执行此操作并包含标签的标记,以便稍后在单元格中找到标签。代码应该类似于

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

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    UILabel *lblDuration= [cell.contentView viewWithTag:1];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] autorelease];
        lblDuration=[[[UILabel alloc] initWithFrame:CGRectMake(110, 11, 60, 21)] autorelease] ;
        lblDuration.tag = 1;
        [cell.contentView addSubview:lblDuration];
    }


    //Get the Log Id for the sections. From Section Array
    int logID=0;
    if(indexPath.row==0)
    {
         NSLog(@"Time Array %@",timeArray);
          logID=[[[sectionArray objectAtIndex:indexPath.section] valueForKey:@"logID"] intValue];
          NSPredicate *p=[NSPredicate predicateWithFormat:@"logID==%d",logID];
          fillRows=nil;
          fillRows= [[timeArray filteredArrayUsingPredicate:p] mutableCopy];
    }

    // Show Current Time.
    //"If condition for not to go for Array Index Out of Bound".
    if(indexPath.row<[fillRows count])
    {
    //Log CurrentTime    
        cell.textLabel.text=[[fillRows objectAtIndex:indexPath.row] valueForKey:@"logCurrentTime"];
    //Log Duration.   


        lblDuration.text=[[fillRows objectAtIndex:indexPath.row] valueForKey:@"logDuration"];

    }
    return cell;
}

很抱歉,我没有尝试编译它,但它应该可以工作。

答案 2 :(得分:0)

当您删除该行时...您还必须删除您在该单元格中添加的UILabel ...您必须明确处理UILabel ...因为您有在单元格上创建了​​一个新视图...

所以只要处理单元格删除行方法,如果你使用它删除....并在该方法中也删除UILabel ...或只使用[tableView reload]数据..这将自动这样做....

快乐编码.. :)