UITableView: `tableView: cellForRowAtIndexPath:` не вызывается для всех строк - PullRequest
1 голос
/ 16 февраля 2011

Я создал UITableView с 4 разделами и 3 рядами, так что всего 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 ]

2 голосов
/ 16 февраля 2011

на самом деле, когда вы прокручиваете, тогда создаются другие строки, если у вас больше строк, поэтому подумайте, что вам нужно написать этот код следующим образом,

Отредактированный

- (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 голос
/ 16 февраля 2011

Проблема с вашим кодом:

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;
}
0 голосов
/ 16 февраля 2011

Исходный код показывает, что таблица ведет себя нормально.
Вы создаете ячейки для первых 3 разделов, потому что они видимы, и в табличном представлении нет дополнительных ячеек, которые вы можете использовать повторно.
Но всякий раз, когда вы получаете прокрутку до 4-го раздела (который сначала не виден), вы начинаете повторно использовать ячейки (которые оказываются теми из 1-го раздела, который не находится за пределами экрана).

Чтобы не потерять данные, введенные пользователем в каждую ячейку, необходимо хранить каждый UITextField (или хотя бы текст из него) в отдельном массиве. Когда таблице требуется определенная ячейка, вы ищите текстовое поле в вашем массиве. Если его там нет, создайте и добавьте новый UITextField.

PS: надеюсь, в коде нет опечаток. Я на работе, и у меня нет Mac здесь.



@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;
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...