滚动后 UITableView 设计无法正常工作
Posted
技术标签:
【中文标题】滚动后 UITableView 设计无法正常工作【英文标题】:UITableView design not worked right after Scrolling 【发布时间】:2016-02-24 14:34:04 【问题描述】:我在我的应用程序中使用了 UITableView 并使用了自定义 Cell,当查看午餐时它工作得很好,但是当滚动表并再次设置它时,它就像丑陋的图像一样。 My normal tableView My tableView after Scrolling
DetailsTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CELL" forIndexPath:indexPath];
cell.selectionStyle=UITableViewCellSelectionStyleNone;
cell.sellPropertyLabel.text=sellPropertyArray[indexPath.row];
cell.sellPropertyTextField.delegate=self;
if (indexPath.row==0)
cell.sellPropertyTextField.tag=indexPath.row;
if (_realEstateTitle)
cell.sellPropertyTextField.text=_realEstateTitle;
else if (indexPath.row==1)
cell.sellPropertyTextField.tag=indexPath.row;
if (_desOfHomeInterior)
cell.sellPropertyTextField.text=_desOfHomeInterior;
else if (indexPath.row==2)
cell.sellPropertyTextField.tag=indexPath.row;
if (_desOfGardenAndExter)
cell.sellPropertyTextField.text=_desOfGardenAndExter;
else if (indexPath.row==3)
cell.sellPropertyTextField.tag=indexPath.row;
if (_locationOfTheProperty)
cell.sellPropertyTextField.text=_locationOfTheProperty;
else if (indexPath.row==4)
cell.sellPropertyTextField.tag=indexPath.row;
if (_whyBuyThisProperty)
cell.sellPropertyTextField.text=_whyBuyThisProperty;
else if (indexPath.row==5)
//cell.selected=YES;
cell.accessoryType=UITableViewCellAccessoryDisclosureIndicator;
cell.sellPropertyTextField.tag=indexPath.row;
cell.sellPropertyTextField.enabled=NO;
if (_country)
cell.sellPropertyTextField.text=_country;
else if (indexPath.row==6)
cell.accessoryType=UITableViewCellAccessoryDisclosureIndicator;
cell.sellPropertyTextField.tag=indexPath.row;
cell.sellPropertyTextField.enabled=NO;
if (_city)
cell.sellPropertyTextField.text=_city;
else if (indexPath.row==7)
cell.sellPropertyTextField.enabled=NO;
cell.accessoryType=UITableViewCellAccessoryDisclosureIndicator;
cell.sellPropertyTextField.tag=indexPath.row;
if (_area)
cell.sellPropertyTextField.text=_area;
else if (indexPath.row==8)
cell.sellPropertyTextField.enabled=NO;
cell.accessoryType=UITableViewCellAccessoryDisclosureIndicator;
cell.sellPropertyTextField.tag=indexPath.row;
if (_type)
cell.sellPropertyTextField.text=_type;
//cell.addAlertTextField.keyboardType=UIKeyboardTypePhonePad;
else if (indexPath.row==9)
cell.sellPropertyTextField.enabled=NO;
cell.accessoryType=UITableViewCellAccessoryDisclosureIndicator;
cell.sellPropertyTextField.tag=indexPath.row;
if (_pool)
cell.sellPropertyTextField.text=_pool;
else if (indexPath.row==10)
cell.sellPropertyTextField.enabled=NO;
cell.accessoryType=UITableViewCellAccessoryDisclosureIndicator;
cell.sellPropertyTextField.tag=indexPath.row;
if (_status)
cell.sellPropertyTextField.text=_status;
else if (indexPath.row==11)
cell.sellPropertyTextField.tag=indexPath.row;
if (_bedrooms)
cell.sellPropertyTextField.text=_bedrooms;
else if (indexPath.row==12)
cell.sellPropertyTextField.tag=indexPath.row;
if (_bathrooms)
cell.sellPropertyTextField.text=_bathrooms;
else if (indexPath.row==13)
cell.sellPropertyTextField.tag=indexPath.row;
if (_livingSpaceSqm)
cell.sellPropertyTextField.text=_livingSpaceSqm;
else if (indexPath.row==14)
cell.sellPropertyTextField.tag=indexPath.row;
if (_landSqm)
cell.sellPropertyTextField.text=_landSqm;
else if (indexPath.row==15)
cell.sellPropertyTextField.tag=indexPath.row;
if (_price)
cell.sellPropertyTextField.text=_price;
else if (indexPath.row==16)
//cell.addAlertTextField.enabled=NO;
cell.accessoryType=UITableViewCellAccessoryDisclosureIndicator;
cell.sellPropertyTextField.tag=indexPath.row;
cell.sellPropertyTextField.enabled=NO;
if (_currency)
cell.sellPropertyTextField.text=_currency;
return cell;
【问题讨论】:
任何 UITableView 功能? 你使用 NSLayoutConstraint 吗? 看起来你在 -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 处返回了错误的单元格高度 我没用这个功能,我用的是UITableView默认高度 cellatindexpath @Ahmed 【参考方案1】:您需要检查单元格,因为它们正在被重复使用。
您的代码结构有点难以修改,有时切换案例会更好。您可以在返回单元格之前将其添加到底部:
switch(indexPath.row)
case 5:
case 6:
case 7:
case 8:
case 9:
case 10:
case 16:
cell.accessoryType=UITableViewCellAccessoryDisclosureIndicator;
break;
default:
cell.accessoryType = UITableViewCellAccessoryNone;
break;
return cell;
【讨论】:
它的工作是删除 AccessoryDisclosureIndicator,但仍然在滚动 textField 背景设置为灰色时,如国家和城市单元格 我建议 2 创建 2 个不同的 uitableview 自定义单元格。或者移动标签下方的文本字段以使内容一致 或者扩展我的例子来调整其他的东西 我修改了你的代码,它工作正常 switch(indexPath.row) case 5: case 6: case 7: case 8: case 9: case 10: case 16: cell.accessoryType=UITableViewCellAccessoryDisclosureIndicator; cell.sellPropertyTextField.enabled=否;休息;默认值:cell.accessoryType = UITableViewCellAccessoryNone; cell.sellPropertyTextField.enabled=YES;休息; 返回单元格; @meda 谢谢【参考方案2】:问题是您的单元格使用了相同的reuseIdentifier
。请分享你的cellForRowAtIndexPath
方法,但我相信你有一些像"ID"
这样的字符串。您有 2 种具有不同配置的单元格,因此您也应该使用不同的标识符。例如"ID1"
用于第一种单元格,"ID2"
用于其他单元格。
This simple example should fix the problem
NSString *identifier = nil;
NSInteger row = indexPath.row;
if ((row >= 5 && row <= 10) || row == 16)
identifier = @"CELLID1";
else
identifier = @"CELLID2";
DetailsTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier forIndexPath:indexPath];
....
或者更简单的解决方案就是在您的案例方法的开头清除accessoryType
DetailsTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier forIndexPath:indexPath];
cell.accessoryType = UITableViewCellAccessoryNone;
【讨论】:
我和你分享了我的代码,但我在我的表格中使用了一个单元格 当你滚动单元格被重复使用。您应该阅读更多相关信息。我会在一分钟内写出解决方案 非常感谢您的照顾,但它不起作用,因为我在故事板中给出了单元格名称以上是关于滚动后 UITableView 设计无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章