UITableView:`tableView:cellForRowAtIndexPath:`没有为所有行调用

时间:2011-02-16 04:56:08

标签: ios iphone uitableview iphone-sdk-3.0

我创建了一个带有4个部分和3个行的UITableView,总共有12行。但

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

上述方法仅被调用9次而不是12次。为什么会这样? 我的第4部分没有建成,但我的第1部分被重复为第4部分。

请参阅下面的代码

@interface MainViewController : UITableViewController<UITextFieldDelegate,UITableViewDelegate,UITableViewDataSource>
 {
}
@end


// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad 
{
  CGRect frameRect = CGRectMake(0,0,320,460);

  UITableView *tableView = [[UITableView alloc] initWithFrame:frameRect   
  style:UITableViewStyleGrouped];
  tableView.delegate = self;
  tableView.dataSource = self;  
  tableView.backgroundColor = [UIColor purpleColor];
  tableView.scrollEnabled = YES;

  self.view = tableView;
  [tableView release];

  [super viewDidLoad];
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    // Return the number of rows in the section.
    return 3;
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    // Return the number of sections.
    return 4;
}

// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{
     NSLog(@"CELL IS NIL %i", indexPath.section);

  static NSString *CellIdentifier = @"Cell";
  UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
  if (cell == nil)
  {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];

      if (indexPath.section == 0)
      {
          if(indexPath.row == 0)
          {
              cell.text = @"Tmail";

              UITextField *aField = [[UITextField alloc]initWithFrame:CGRectMake(100,10,200,40)];
              aField.placeholder = @"Mandatory";
              aField.delegate = self;
              aField.textColor = [UIColor blackColor];
              [cell addSubview:aField];
              [aField release];
          }
          else if ( indexPath.row == 1 )
          {
              cell.text = @"English";
              UITextField *aField = [[UITextField alloc]initWithFrame:CGRectMake(100,10,200,40)];
              aField.placeholder = @"Mandatory";
              aField.delegate = self;
              aField.textColor = [UIColor blackColor];
              [cell addSubview:aField];
              [aField release];
          }
          else
          {
              cell.text = @"Hindi";
              UITextField *aField = [[UITextField alloc]initWithFrame:CGRectMake(100,10,200,40)];
              aField.placeholder = @"Mandatory";
              aField.delegate = self;
              aField.textColor = [UIColor blackColor];
              [cell addSubview:aField];
              [aField release];
          }
      }
      else if (indexPath.section == 1)
      {
          if(indexPath.row == 0)
          {
              cell.text = @"Street";

              UITextField *aField = [[UITextField alloc]initWithFrame:CGRectMake(100,10,200,40)];
              aField.placeholder = @"Mandatory";
              aField.delegate = self;
              aField.textColor = [UIColor blackColor];
              [cell addSubview:aField];
              [aField release];
          }
          else if ( indexPath.row == 1 )
          {
              cell.text = @"City";
              UITextField *aField = [[UITextField alloc]initWithFrame:CGRectMake(100,10,200,40)];
              aField.placeholder = @"Mandatory";
              aField.delegate = self;
              aField.textColor = [UIColor blackColor];
              [cell addSubview:aField];
              [aField release];
          }
          else
          {
              cell.text = @"State";
              UITextField *aField = [[UITextField alloc]initWithFrame:CGRectMake(100,10,200,40)];
              aField.placeholder = @"Mandatory";
              aField.delegate = self;
              aField.textColor = [UIColor blackColor];
              [cell addSubview:aField];
              [aField release];
          }
      }
      else if (indexPath.section == 2)
      {
          if(indexPath.row == 0)
          {
              cell.text = @"Salem";

              UITextField *aField = [[UITextField alloc]initWithFrame:CGRectMake(100,10,200,40)];
              aField.placeholder = @"Mandatory";
              aField.delegate = self;
              aField.textColor = [UIColor blackColor];
              [cell addSubview:aField];
              [aField release];
          }
          else if ( indexPath.row == 1 )
          {
              cell.text = @"Samalpatti";
              UITextField *aField = [[UITextField alloc]initWithFrame:CGRectMake(100,10,200,40)];
              aField.placeholder = @"Mandatory";
              aField.delegate = self;
              aField.textColor = [UIColor blackColor];
              [cell addSubview:aField];
              [aField release];
          }
          else
          {
              cell.text = @"Chennai";
              UITextField *aField = [[UITextField alloc]initWithFrame:CGRectMake(100,10,200,40)];
              aField.placeholder = @"Mandatory";
              aField.delegate = self;
              aField.textColor = [UIColor blackColor];
              [cell addSubview:aField];
              [aField release];
          }
      }

      else if (indexPath.section == 3)
      {
          if(indexPath.row == 0)
          {
              cell.text = @"NOKIA";
              UITextField *aField = [[UITextField alloc]initWithFrame:CGRectMake(100,10,200,40)];
              aField.placeholder = @"Mandatory";
              aField.delegate = self;
              aField.textColor = [UIColor blackColor];
              [cell addSubview:aField];
              [aField release];
          }
          else if ( indexPath.row == 1)
          {
              cell.text = @"SAMSUNG";
              UITextField *aField = [[UITextField alloc]initWithFrame:CGRectMake(100,10,200,40)];
              aField.placeholder = @"Mandatory";
              aField.delegate = self;
              aField.textColor = [UIColor blackColor];
              [cell addSubview:aField];
              [aField release];
          }
          else
          {
              cell.text = @"SONY";
              UITextField *aField = [[UITextField alloc]initWithFrame:CGRectMake(100,10,200,40)];
              aField.placeholder = @"Mandatory";
              aField.delegate = self;
              aField.textColor = [UIColor blackColor];
              [cell addSubview:aField];
              [aField release];
          }
      }
   }

  return cell;
}

enter image description here

3 个答案:

答案 0 :(得分:2)

实际上滚动时会创建其他行,以防你有更多的行,所以你需要编写这样的代码,

已编辑

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    {
         NSLog(@"CELL IS NIL %i", indexPath.section);

      static NSString *CellIdentifier = @"Cell";
if (cell == nil) 
    {

        CGRect CellFrame = CGRectMake(0, 0, 300, 70);
        cell = [[[UITableViewCell alloc] initWithFrame:CellFrame reuseIdentifier:CellIdentifier] autorelease];
        CGRect labLabelFrame = CGRectMake(5, 5, 250, 40);
        UILabel *lblTemp;

        lblTemp = [[UILabel alloc] initWithFrame:labLabelFrame];
        lblTemp.tag = 1;
        [cell.contentView addSubview:lblTemp];
        [lblTemp release];

        CGRect textFieldFrame= CGRectMake(200, 5, 120, 30);

        UITextField *txt=[[UITextField alloc] initWithFrame:textFieldFrame];
        text.tag=2;
        [cell.contentView addSubview:txt];
        [txt release];

    }
     UILabel *cellLabel = (UILabel *)[cell viewWithTag:1];
      UITextField *aField=(UITextField *)[cell viewWithTag:2];

    aField.text=@"";
    aField.placeholder=@"";
if (indexPath.section == 0)
              {
                  if(indexPath.row == 0)
                  {
                      cellLabel.text = @"Tmail";


                      aField.placeholder = @"Mandatory";
                      aField.delegate = self;
                      aField.textColor = [UIColor blackColor];

                  }
                  else if ( indexPath.row == 1 )
                  {
                      cellLabel.text = @"English";

                      aField.placeholder = @"Mandatory";
                      aField.delegate = self;
                      aField.textColor = [UIColor blackColor];


                  }
                  else
                  {
                      cellLabel.text = @"Hindi";

                      aField.placeholder = @"Mandatory";
                      aField.delegate = self;
                      aField.textColor = [UIColor blackColor];


                  }
              }
              else if (indexPath.section == 1)
              {
                  if(indexPath.row == 0)
                  {
                      cellLabel.text = @"Street";


                      aField.placeholder = @"Mandatory";
                      aField.delegate = self;
                      aField.textColor = [UIColor blackColor];

                  }
                  else if ( indexPath.row == 1 )
                  {
                      cellLabel.text = @"City";

                      aField.placeholder = @"Mandatory";
                      aField.delegate = self;
                      aField.textColor = [UIColor blackColor];


                  }
                  else
                  {
                      cellLabel.text = @"State";

                      aField.placeholder = @"Mandatory";
                      aField.delegate = self;
                      aField.textColor = [UIColor blackColor];

                  }
              }
              else if (indexPath.section == 2)
              {
                  if(indexPath.row == 0)
                  {
                      cellLabel.text = @"Salem";
                      aField.placeholder = @"Mandatory";
                      aField.delegate = self;
                      aField.textColor = [UIColor blackColor];

                  }
                  else if ( indexPath.row == 1 )
                  {
                      cellLabel.text = @"Samalpatti";

                      aField.placeholder = @"Mandatory";
                      aField.delegate = self;
                      aField.textColor = [UIColor blackColor];


                  }
                  else
                  {
                      cellLabel.text = @"Chennai";

                      aField.placeholder = @"Mandatory";
                      aField.delegate = self;
                      aField.textColor = [UIColor blackColor];


                  }
              }

              else if (indexPath.section == 3)
              {
                  if(indexPath.row == 0)
                  {
                      cellLabel.text = @"NOKIA";

                      aField.placeholder = @"Mandatory";
                      aField.delegate = self;
                      aField.textColor = [UIColor blackColor];

                  }
                  else if ( indexPath.row == 1)
                  {
                      cellLabel.text = @"SAMSUNG";

                      aField.placeholder = @"Mandatory";
                      aField.delegate = self;
                      aField.textColor = [UIColor blackColor];


                  }
                  else
                  {
                      cellLabel.text = @"SONY";

                      aField.placeholder = @"Mandatory";
                      aField.delegate = self;
                      aField.textColor = [UIColor blackColor];

                  }
              }


          return cell;
        }

答案 1 :(得分:1)

您的代码存在问题:

1)细胞正在重复使用。但是您添加为子视图的文本字段不会被删除!

2)每当你的cellforRowAtIndex被调用时,你每次都要添加文本字段。但是你忘了你已经添加了一个文本字段但没有删除它。

  • 这是重叠的原因。

解决方案:  对UITableViewCell进行子类化,并在其initWithFrame方法中添加文本字段,并将数据传递给该单元格。这将解决您的问题,这也会减少您的cellForRowAtIndex方法长度。

示例代码: CustomCell.h:

#import <UIKit/UIKit.h>

@class contactr;
@interface CustomTableCell : UITableViewCell 
{
    UITextField *mTextField;
}
@property(nonatomic , retain) UITextField *textField;

@end

<强> CustomCell.m:

#import "CustomTableCell.h"
@synthesize textField = mTextField;
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier 
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) 
    {       
        UITextField *textField = [[UITextField alloc]initWithFrame:CGRectMake(100,10,200,40)];

        self.textField = textField;
        [textField release];
        [self addSubview:self.textField];

    }
    return self;
}

- (void)dealloc 
{
    self.textfield = nil;
    [super dealloc];
}


@end

将此类用作tableViewCell。

你的cellForRowAtIndex必须是:

// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{
     NSLog(@"CELL IS NIL %i", indexPath.section);

  static NSString *CellIdentifier = @"Cell";
  CustomTableCell *cell = (CustomTableCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
  if (cell == nil)
  {


    cell = [[[CustomTableCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];

   }
 cell.textField.placeholder = @"";
 cell.textField.text = @"";
      if (indexPath.section == 0)
      {
          if(indexPath.row == 0)
          {
              cell.text = @"Tmail";
              cell.textField.placeholder = @"Mandatory";
              cell.textField.delegate = self;
          }
          else if ( indexPath.row == 1 )
          {
              cell.text = @"English";
              cell.textField.placeholder = @"Mandatory";
              cell.textField.delegate = self;
          }
          else
          {
              cell.text = @"Hindi";
              cell.textField.placeholder = @"Mandatory";
              cell.textField.delegate = self;
          }
      }
      else if (indexPath.section == 1)
      {
          if(indexPath.row == 0)
          {
              cell.text = @"Street";
              cell.textField.placeholder = @"Mandatory";
              cell.textField.delegate = self;
          }
          else if ( indexPath.row == 1 )
          {
              cell.text = @"City";
              cell.textField.placeholder = @"Mandatory";
              cell.textField.delegate = self;
          }
          else
          {
              cell.text = @"State";
              cell.textField.placeholder = @"Mandatory";
              cell.textField.delegate = self;

          }
      }
      else if (indexPath.section == 2)
      {
          if(indexPath.row == 0)
          {
              cell.text = @"Salem";

              cell.textField.placeholder = @"Mandatory";
              cell.textField.delegate = self;
          }
          else if ( indexPath.row == 1 )
          {
              cell.text = @"Samalpatti";
              cell.textField.placeholder = @"Mandatory";
              cell.textField.delegate = self;
              cell.textField.textColor = [UIColor blackColor];

          }
          else
          {
              cell.text = @"Chennai";
              cell.textField.placeholder = @"Mandatory";
              cell.textField.delegate = self;
              cell.textField.textColor = [UIColor blackColor];

          }
      }

      else if (indexPath.section == 3)
      {
          if(indexPath.row == 0)
          {
              cell.text = @"NOKIA";
              cell.textField.placeholder = @"Mandatory";
              cell.textField.delegate = self;
              cell.textField.textColor = [UIColor blackColor];
          }
          else if ( indexPath.row == 1)
          {
              cell.text = @"SAMSUNG";
              cell.textField.placeholder = @"Mandatory";
              cell.textField.delegate = self;
              cell.textField.textColor = [UIColor blackColor];
          }
          else
          {
              cell.text = @"SONY";
              cell.textField.placeholder = @"Mandatory";
             cell.textField.delegate = self;
              cell.textField.textColor = [UIColor blackColor];
          }
      }




  return cell;
}

答案 2 :(得分:0)

从初始代码开始,tableview表现正常 您可以为前3个部分创建单元格,因为它们是可见的,并且表格视图中没有可以重复使用的额外单元格 但是,无论何时滚动到第4部分(最初都不可见),您就开始重复使用单元格(恰好是第1部分中没有出现的部分)。

为了不丢失用户在每个单元格中输入的数据,您需要将每个UITextField(或至少其中的文本)存储在单独的数组中。当表需要某个单元格时,您将在数组中查找文本字段。如果不存在,请创建并添加新的UITextField。

PS:我希望代码没有任何拼写错误。我在工作,我这里没有麦克风。



@interface MainViewController : UITableViewController
 {
 NSMutableArray* textFields;
}
@end

// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad 
{
  CGRect frameRect = CGRectMake(0,0,320,460);

  UITableView *tableView = [[UITableView alloc] initWithFrame:frameRect   
  style:UITableViewStyleGrouped];
  tableView.delegate = self;
  tableView.dataSource = self;  
  tableView.backgroundColor = [UIColor purpleColor];
  tableView.scrollEnabled = YES;

  self.view = tableView;
  [tableView release];

  [super viewDidLoad];
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    // Return the number of rows in the section.
    return 3;
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    // Return the number of sections.
    return 4;
}

- (UITextField*)getTextFieldAtIndexPath:(NSIndexPath*)indexPath
{
    if (textFields == nil)
      textFields = [[NSMutableArray alloc] init];

    // Add padding, just in case UITableView doesn't need the cells in order
    while (indexPath.section >= [textFields count])
    {
        [textFields addObject:[NSNull null]];
    }

    // Get the section list
   NSMutableArray* sectionList = [textFields objectAtIndex:indexPath.section]; 

   if (sectionList == [NSNull null])
   {
     sectionList = [[[NSMutableArray alloc] init] autorelease];
     [textFields replaceObjectAtIndex:indexPath.section withObject:sectionList];
   }


   // Now that we have the section list, we need to do the same for the row
    while (indexPath.row >= [sectionList count])
    {
        [sectionList addObject:[NSNull null]];
    }

    UITextField* afield = [sectionList objectAtIndex:indexPath.row];

    if (afield == [NSNull null])
    {
      // If there was no afield stored there, just create a new one  
      afield = [[UITextField alloc] initWithFrame:CGRectMake(100,10,200,40)];
      afield.placeholder = @"Mandatory";
      afield.delegate = self;
      afield.textColor = [UIColor blackColor]; 

      [sectionList replaceObjectAtIndex:indexPath.row withObject:aField];

      [afield release];
    }

    return afield;
}

// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{
     NSLog(@"CELL IS NIL %i", indexPath.section);

  static NSString *CellIdentifier = @"Cell";
  UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
  UITextField *aField;

 // If we can't reuse the cell, just create a new one
  if (cell == nil)
  {
      cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
  }
  else
  {
      // if we are reusing the cell, just remove the old textField to make room for the new one
      [[cell.contentView viewForTag:1234] removeFromSuperview];
  }

  // Get the text field for this cell. The method below will create a new one if it doesn't exist, or just return the existing one if found.
  aField = [self getTextFieldAtIndexPath:indexPath];

  // Just add this textfield to the cell
  [cell.contentView addSubView:aField];

  // Now that we added the textfield, we only need to set the title of the cell. The content of the textField will be cached and moved around.

      if (indexPath.section == 0)
      {
          if(indexPath.row == 0)
              cell.text = @"Tmail";
          else if ( indexPath.row == 1 )
              cell.text = @"English";
          else
              cell.text = @"Hindi";
      }
      else if (indexPath.section == 1)
      {
          if(indexPath.row == 0)
              cell.text = @"Street";
          else if ( indexPath.row == 1 )
              cell.text = @"City";
          else
              cell.text = @"State";
      }
      else if (indexPath.section == 2)
      {
          if(indexPath.row == 0)
              cell.text = @"Salem";
          else if ( indexPath.row == 1 )
              cell.text = @"Samalpatti";
          else
              cell.text = @"Chennai";
      }

      else if (indexPath.section == 3)
      {
          if(indexPath.row == 0)
              cell.text = @"NOKIA";
          else if ( indexPath.row == 1)
              cell.text = @"SAMSUNG";
          else
              cell.text = @"SONY";
      }
   }

  return cell;
}