我有一个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];
答案 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];
}