0

我有一个带有自定义单元格的表格,在单元格中有两个 UIView,顶部始终显示,底部隐藏。

cellCellForRowAtIndexPath被调用时,所有单元格的高度都会降低,只显示顶部的 UIView。

当用户单击单元格时,该单元格会展开,然后我取消隐藏第二个 UIView。问题是有时第二个 UIView 在第一次单击单元格时不会出现。

再次单击单元格使其全部消失,然后再次单击,它总是完美显示。向下滚动然后选择另一个,第一次单击它可能不会出现或将在错误的位置,再舔两次,它就完美了。

我认为这是一个 ReusableCell 问题,但我不知道如何解决它。

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

cellID = @"Cell";

customCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID forIndexPath:indexPath];

// Test to see if the Cell has already been built
if (cell == nil)
{
    cell = [[customCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellID];
}

// Check if the selected Cell is being drawn and unhide the pull down view and adjust y origin
if(indexPath.row == selectedCell)
{
     // Unhide the view
     cell.pullDownView.hidden = NO;

    CGRect tempFrame = cell.pullDownView.frame;
    tempFrame.origin.y = [[secondViewY objectAtIndex:indexPath.row] floatValue];
    cell.pullDownView.frame = tempFrame;

     // Image in second view    
     cell.mainImage2.image = [theImages objectAtIndex:indexPath.row]; 
}
else
{
    cell.pullDownView.hidden = YES;
}

// Image in first view
cell.mainImage.image = [theImages objectAtIndex:indexPath.row];




return cell;
}

所以单击一个单元格会调用如下所示的didSelectRow

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{

if(selectedCell == indexPath.row)
{
    selectedCell = -1;
    [tableView deselectRowAtIndexPath:indexPath animated:NO];
}
else
{
    selectedCell = indexPath.row;
}

//    [tableView reloadData];

[tableView beginUpdates];
[tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationMiddle];
[tableView endUpdates];
}

如您所见,我已经尝试了 reloadData 和 BeginUpdates ,但这仍然不起作用。这是因为我隐藏/取消隐藏应该在选择时将 Alpha 设置为 0 然后 1 吗?这是可重复使用的细胞吗?

哦,为了完整性。您可能会注意到我有一个所有高度都不同的表格,这就是我更改第二个 UIView 的 Y 的原因。

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{

float returnHeightValue;

if(indexPath.row == selectedCell)
{
    returnHeightValue = [[selectedCellHeights objectAtIndex:indexPath.row] floatValue];
}
else
{
    returnHeightValue = [[normalCellHeights objectAtIndex:indexPath.row] floatValue];
}


return returnHeightValue;

}
4

2 回答 2

0

好的,我已经改变了处理这些项目的方式。我已经删除了 UIView(它们都嵌入其中),而是现在我的自定义单元格的 .h 中有。

@property (nonatomic, strong) IBOutletCollection(UILabel) NSArray *pullDownItems;
@property (weak, nonatomic) IBOutlet UIImageView *mainImage;

而不是

@property (weak, nonatomic) IBOutlet UIView *pullDownView;

好的,所以现在我必须取消隐藏并移动两个项目而不是一个,但这比单独 ding 会很痛苦(大约有 10 个 UILabel)要好得多。我已经像这样枚举了数组;

    for(UILabel *obj in cell.pullDownItems)
    {
        obj.hidden = NO;
        tempFrame = obj.frame;
        tempFrame.origin.y = tempFrame.origin.y - tempYOffset;
        obj.frame = tempFrame;
    }

我刚刚附上的任何新项目。

于 2013-06-20T15:32:11.647 回答
0

好的改变了它,因为在改变的单元格上隐藏和取消隐藏内容效果不佳(在表格中留下了工件,有时事情不会出现)。

我现在正在创建两个自定义单元格,一个在选择单元格时具有所有其他对象,另一个则没有。

到目前为止,这似乎是更好的方法。

于 2013-07-01T11:06:12.640 回答