2011-02-16 88 views
1

我的iPhone应用程序中有一个奇怪的问题。 我创建了一个UITableView,包含4个部分和3个行,共计12行。但是另一个UITableView问题

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

上述方法只被调用了9次而不是12次。为什么会发生这种情况。 我的第四部分没有被修建,但我的第一部分被复制为第四部分。

感谢您的时间和帮助。

普莱舍参考下

@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

+0

尝试清洁构建。并从项目文件夹中删除构建目录。我遇到了同样的问题,甚至更糟。所以删除构建目录 – Robin 2011-02-16 05:02:18

+0

@ barbaghal,通过图像显示你需要调整你的文本框架和标签框架之间的差距。 – Ishu 2011-02-17 04:14:14

回答

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]; 

    [email protected]""; 
    [email protected]""; 
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; 
     } 
+0

@Ishu:谢谢你的回复dude ..它的作品,但在uitextfiled里面输入文本后,当滚动可用视图我得到文本重叠问题..任何想法? – user198725878 2011-02-16 05:17:48

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

从您最初的代码中,实现代码如下行为正常。
您可以为前3个部分创建单元格,因为它们是可见的,并且表格视图中没有可以重复使用的额外单元格。
但是,无论何时滚动到第4部分(开始时都不可见),您都会重新使用单元格(恰好来自第一部分的单元格不在屏幕之外)。

为了不丢失用户在每个单元格中输入的数据,您需要将每个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; 
}