3

ではcellForRowAtIndexPath、ランダム化を使用して 2 つの異なるカスタム タイプのいずれかを作成しています。それらを and とUITableViewCell呼びましょう(1 つはイメージを含み、もう 1 つはテキストを含み、各行に表示されるランダムです)。これは非常に基本的に次のようにレイアウトされています。LCImageCellLCTextCell

- (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画像セルを統合するようになりました。問題のセルが であるかどうかをどのように知ることができるLCImageCellか疑問に思っている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 とします) を作成します。セル固有の情報を保持するクラスを定義できます (LCTextCell 内に表示される文字列であるクラス A 内に NSString インスタンスを定義できます。同様に、表示される画像を表すクラス B 内に url インスタンスを持つことができます)。 LCImageCell 内)。特定のインデックス(テーブルビューの行)に必要なセルに応じて、AまたはBのインスタンスを含むビューコントローラーに配列(myArrayなど)を保持する必要があります。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 に答える