我创建了一个带有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;
}
答案 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;
}