滚动后 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 设计无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

自定义 UITableview 单元格可访问性无法正常工作

切换到 iOS 7 后 UITableView 不滚动

使用大标题时 iOS 11 滚动到顶部无法正常工作

根据图像问题的 UITableview 单元格高度

UITableView 作为另一个 UITableView 上的单元格取消滚动

使用 PanGesture 后 SwipeGestureRecognizer 无法正常工作