3

cellForRowAtIndexPath中,我使用随机化来创建两种不同的自定义UITableViewCell类型之一,我们称它们为LCImageCelland LCTextCell(一个包含图像,一个包含一些文本,它是随机的,将显示在每一行中)。这基本上是这样排列的:

- (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath
{
    // Determine whether the cell should contain an image or text..
    BOOL isCellAnImage;
    int randomChanceOfImageAppearing = arc4random() % 5;
    if (randomChanceOfImageAppearing == 4) isCellAnImage = YES;
    else isCellAnImage = NO;

    // If the cell is going to contain an image..
    if (isCellAnImage) {
        LCIImageCell *imageCell = [tableView dequeueReusableCellWithIdentifier: @"ImageCell"];
        if (imageCell == nil) {
            imageCell = [[LCImageCell alloc] initWithStyle: UITableViewCellStyleValue1 reuseIdentifier: @"ImageCell"];
        }

        return imageCell;

    // Else the cell will contain text..
    } else {
        // Make and allocate the cell if necessary.
        LCTextCell *customCell = [tableView dequeueReusableCellWithIdentifier: @"CustomCell"];
        if (customCell == nil) {
            customCell = [[LCTextCell alloc] initWithStyle: UITableViewCellStyleValue1 reuseIdentifier: @"CustomCell"];
        }
        return customCell;
    }
}

我需要动态设置带有文本(LCTextCell实例)的高度,并且工作正常。我现在要整合图像单元格,我想知道如何让我heightForRowAtIndexPath知道有问题的单元格是 anLCImageCell还是 a LCTextCell,以便我只能在有问题的单元格是时应用高度调整LCTextCell

我可以在设置高度之前访问应用高度的单元格吗?它甚至在那个时间点被创建/分配/初始化了吗?

4

3 回答 3

6

-cellForRowAtIndexPath:看似合乎逻辑的事情是从内部调用-tableView:heightForRowAtIndexPath:。然而,这是不好的形式(出于某种原因,后者在前者之前被调用)并且可能导致性能问题(每次显示表格时都会为表格中heightForRowAtIndexPath每个单元格调用,甚至是不可见的单元格)。

相反,将单元格随机化移动到 viewController 生命周期的早期。例如,假设您事先知道每种单元格类型的高度(并且您的 tableView 有一个部分):

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSMutableArray *mutableArray = [[NSMutableArray alloc] init];

    for (int i = 0; i < [self.tableView numberOfRowsInSection:0]; i++) {
        if (arc4random() % 5 == 4) {
            [mutableArray addObject:[LCImageCell class]];
        } else {
            [mutableArray addObject:[LCImageCell class]];
        }
    }

    self.cellTypes = [NSArray arrayWithArray:mutableArray];
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if ([[self.cellTypes objectAtIndex:indexPath.row] isEqual:[LCImageCell class]]) {
        [LCImageCell height];  // class method returns static height for an image cell
    } else {
        [LCTextCell height];   // class method returns static height for a text cell
    };
}

如果高度是动态的,您也应该提前计算并存储它

于 2013-02-20T12:52:49.580 回答
1

为 LCTextCell 创建一个类(比如 A),为 LCImageCell 创建另一个类(比如 B)。您可以定义类来保存单元格特定信息(您可以在 A 类中定义一个 NSString 实例,它可以是在 LCTextCell 中显示的字符串,同样您可以在 B 类中有一个 url 实例,它代表显示的图像在 LCImageCell 内)。您必须在视图控制器中保存一个数组(例如 myArray),该数组将包含 A 或 B 的实例,具体取决于您希望在特定索引(tableview 行)上的哪个单元格。您只需确保在调用 heightForRowAtIndexPath 方法之前数组具有正确的条目。

然后你可以有

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{        
    if([[self.myArray objectAtIndex:row] isKindOfClass:[A class]])
    {
        //LCTextCell
        return ...;
    }
        else if([[self.myArray objectAtIndex:row] isKindOfClass:[B class]])
    {
        //LCImageCell
        return ...;
    }
    return 50.0f;
}
于 2013-02-20T12:52:50.373 回答
-1

你可以这样做:

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *customCell = [self.tableView cellForRowAtIndexPath:indexPath];
    if([customCell isMemberOfClass:[LCImageCell class])
    {
        return ...;
    }
        else if([customCell isMemberOfClass:[LCTextCell class])
    {
        return ...;
    }
    return 0.0f;
}
于 2013-02-20T11:40:10.907 回答