滚动期间的Tableview奇怪行为

时间:2013-06-13 03:48:34

标签: ios uitableview

我有一个tableview,其中包含30个字段(标签,文本字段,星级,以及其他一些UIView,picercontrol)。问题是当我滚动表格视图时,单元格正在被替换。对此有什么解决方案? 编辑:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"ReuseCell";
   // UIColor* mainColor = [UIColor colorWithRed:43.0/255 green:128.0/255 blue:191.0/255 alpha:1.0f];
    UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell==nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] ;
        if (indexPath.section==0) {

            if (indexPath.row==0) {
                productImage=[self createImageWithFrame: CGRectMake(115.5, 10, 89,89)];
                productImage.tag=indexPath.row+indexPath.section;
                [cell.contentView addSubview: productImage];
            }
            else{
                titleLabel1=[self createLabelWithFrame:CGRectMake(4, 5, 100, 30)];////normal label
                titleLabel1.tag=indexPath.row+indexPath.section;
                [cell.contentView addSubview:titleLabel1];
                titleLabel1.text=[labelArray objectAtIndex:indexPath.row-1];
                if (indexPath.row==2) {
                productImage=[self createImageWithFrame: CGRectMake(104, 10, 190,20)];
                productImage.tag=indexPath.row+indexPath.section;;
                [cell.contentView addSubview: productImage];

                }
               else if (indexPath.row==7) {
                titleLabel1=[self createLabelWithFrame:CGRectMake(4, 5, 100, 30)];////time label
                titleLabel1.tag=indexPath.row+indexPath.section;
               [cell.contentView addSubview:titleLabel1];
                }
               else if (indexPath.row==8) {
                titleLabel1=[self createLabelWithFrame:CGRectMake(4, 5, 100, 30)];///time label
                titleLabel1.tag=indexPath.row+indexPath.section;
               [cell.contentView addSubview:titleLabel1];
                }
              else  if (indexPath.row==9) {
                    descriptionText=[[UITextView alloc]initWithFrame:CGRectMake(104, 10, 190, 50)];
                    descriptionText.tag =indexPath.row+indexPath.section;
                    [cell.contentView addSubview:descriptionText];
                }
              else{
                textFld=[self createTextFieldWithFrame:CGRectMake(104, 10, 190, 20)];
                textFld.tag=indexPath.row+indexPath.section;
                [cell.contentView addSubview:textFld];
                  textFld.text=[labelArray objectAtIndex:indexPath.row-1];
              }
            }

        }
    }

    ///////trying to resuse the cell
    if (indexPath.section==0) {
        if (indexPath.row==0) {
            productImage=(UIImageView *)[cell.contentView viewWithTag:indexPath.row+indexPath.section];
            //productImage.image=
        }
        else{
            titleLabel1=(UILabel *)[cell.contentView viewWithTag:indexPath.row+indexPath.section];
            titleLabel1.text=[labelArray objectAtIndex:indexPath.row+indexPath.section-1];
            if (indexPath.row==2) {
               // productImage=[self createImageWithFrame: CGRectMake(104, 10, 190,20)];


            }
            if (indexPath.row==7) {
              // titleLabel1=(UILabel *)[cell.contentView viewWithTag:indexPath.row+indexPath.section];////time label


            }
            if (indexPath.row==8) {
              // titleLabel1=(UILabel *)[cell.contentView viewWithTag:indexPath.row+indexPath.section];;///time label


            }
         //   textFld=(UITextField *)[cell.contentView viewWithTag:indexPath.row+indexPath.section];

            if (indexPath.row==9) {

            }
        }

    }

编辑:留出7节,1节:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"ReuseCell";
   // UIColor* mainColor = [UIColor colorWithRed:43.0/255 green:128.0/255 blue:191.0/255 alpha:1.0f];
    UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell==nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] ;
        cell.tag=indexPath.row;
        if (indexPath.row!=0) {
            titleLabel1=[self createLabelWithFrame:CGRectMake(4, 5, 100, 30)];
            titleLabel1.tag=indexPath.row+indexPath.section;
            [cell.contentView addSubview:titleLabel1];

        }
        NSLog(@"%d",indexPath.row);
    }
    else{
        titleLabel1=(UILabel *)[cell.contentView viewWithTag:indexPath.row+indexPath.section];
    }
    if (indexPath.row!=0) 
         titleLabel1.text=[labelArray objectAtIndex:indexPath.row+indexPath.section-1];
      return cell;
}
and my labelArray is:
 labelArray=[[NSMutableArray alloc]initWithObjects:@"*Name",@"Category",@"Brand",@"Model",@"Serial no",@"Bill no",@"*Purchase date",@"*Expiry Date",@"Description",nil];

3 个答案:

答案 0 :(得分:2)

问题在于设置标记值: 使用indexPath.row*indexPath.section+9999(some value);

试试这个:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"ReuseCell";
   // UIColor* mainColor = [UIColor colorWithRed:43.0/255 green:128.0/255 blue:191.0/255 alpha:1.0f];
    UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell==nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] ;
        if (indexPath.section==0) {

            if (indexPath.row==0) {
                productImage=[self createImageWithFrame: CGRectMake(115.5, 10, 89,89)];
                productImage.tag=indexPath.row*indexPath.section+9999;
                [cell.contentView addSubview: productImage];
            }
            else{
                titleLabel1=[self createLabelWithFrame:CGRectMake(4, 5, 100, 30)];////normal label
                titleLabel1.tag=indexPath.row*indexPath.section+9999;
                [cell.contentView addSubview:titleLabel1];
                titleLabel1.text=[labelArray objectAtIndex:indexPath.row-1];
                if (indexPath.row==2) {
                productImage=[self createImageWithFrame: CGRectMake(104, 10, 190,20)];
                productImage.tag=indexPath.row*indexPath.section+9999;;
                [cell.contentView addSubview: productImage];

                }
               else if (indexPath.row==7) {
                titleLabel1=[self createLabelWithFrame:CGRectMake(4, 5, 100, 30)];////time label
                titleLabel1.tag=indexPath.row*indexPath.section+9999;
               [cell.contentView addSubview:titleLabel1];
                }
               else if (indexPath.row==8) {
                titleLabel1=[self createLabelWithFrame:CGRectMake(4, 5, 100, 30)];///time label
                titleLabel1.tag=indexPath.row*indexPath.section+9999;
               [cell.contentView addSubview:titleLabel1];
                }
              else  if (indexPath.row==9) {
                    descriptionText=[[UITextView alloc]initWithFrame:CGRectMake(104, 10, 190, 50)];
                    descriptionText.tag =indexPath.row*indexPath.section+9999;
                    [cell.contentView addSubview:descriptionText];
                }
              else{
                textFld=[self createTextFieldWithFrame:CGRectMake(104, 10, 190, 20)];
                textFld.tag=indexPath.row*indexPath.section+9999;
                [cell.contentView addSubview:textFld];
                  textFld.text=[labelArray objectAtIndex:indexPath.row*indexPath.section-1];//check this line I dont have idea about your array.
              }
            }

        }
    }

    ///////trying to resuse the cell
    if (indexPath.section==0) {
        if (indexPath.row==0) {
            productImage=(UIImageView *)[cell.contentView viewWithTag:indexPath.row*indexPath.section+9999;];
            //productImage.image=
        }
        else{
            titleLabel1=(UILabel *)[cell.contentView viewWithTag:indexPath.row*indexPath.section+9999;];
            titleLabel1.text=[labelArray objectAtIndex:indexPath.row+indexPath.section-1];
            if (indexPath.row==2) {
               // productImage=[self createImageWithFrame: CGRectMake(104, 10, 190,20)];


            }
            if (indexPath.row==7) {
              // titleLabel1=(UILabel *)[cell.contentView viewWithTag:indexPath.row*indexPath.section+9999;];////time label


            }
            if (indexPath.row==8) {
              // titleLabel1=(UILabel *)[cell.contentView viewWithTag:indexPath.row*indexPath.section+9999;];;///time label


            }
         //   textFld=(UITextField *)[cell.contentView viewWithTag:indexPath.row*indexPath.section+9999;];

            if (indexPath.row==9) {

            }
        }

    }

你错过了:return cell;

答案 1 :(得分:1)

问题是由于正确标记了单元格内的视图。在您的实现中,第一行的第0行和第一部分的第0行将使用相同的数字标记。

您应该通过以下方式标记视图:

productImage.tag=indexPath.row+indexPath.section*1000;

以相同的方式检索它们:

productImage=(UIImageView *)[cell.contentView viewWithTag:indexPath.row+indexPath.section*1000];

答案 2 :(得分:0)

滚动表视图时,相应的单元格在内部调用reload方法。为避免这种情况,您应该使用可重复使用的单元格:

static NSString *cellIdentifier = @"cellID";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

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