1

XIB からカスタム セルをロードする UITableView を作成しようとしています。.m および .h ファイルと一緒に EventsCell.xib があります。

セルのコンテンツと高さは動的で、未知の数のサブビューを含むことができます。

これは、セルをロードするコードです。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        static NSString *CellIdentifier = @"EventsCellIdentifier";

        EventsCell *cell = (EventsCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

        if (cell == nil) 
        {
            NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"EventsCell" owner:self options:nil];
            cell = [nib objectAtIndex:0];        
        }

        NSDictionary *hour = [[[eventsArray objectAtIndex:[indexPath section]] valueForKey:@"hours"] objectAtIndex:[indexPath row]];

        NSArray *events = [hour valueForKey:@"events"];

        cell.events = events;
        cell.timeLabel.text = [hour valueForKey:@"name"];

        int offset = 0;
        for(NSDictionary *event in events)
        {
            UIView *vvv = [[UIView alloc] initWithFrame:CGRectMake(50, offset, 270, 44)];
            [vvv setBackgroundColor:[UIColor clearColor]];

            UILabel *lab = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 200, 44)];
            lab.text = [event valueForKey:@"name"];
            lab.backgroundColor = [UIColor clearColor];

            [vvv addSubview:lab];

            [cell.contentView addSubview:vvv];

            offset += 44;
        }    

        return cell;
    }

セルをロードしますが、テーブルビューで数回スクロールすると、コンテンツは次のようになります。

ここに画像の説明を入力

私は何を間違っていますか? ...

ありがとうございました!

==================== 更新 ====================

今、別のことが起こっています。別のView Controllerのセルに追加するサブビューのすべての要素を追加しました。以下のように。

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        static NSString *CellIdentifier = @"EventsCellIdentifier";

        EventsCell *cell = (EventsCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

        if (cell == nil) 
        {
            NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"EventsCell" owner:self options:nil];
            cell = [nib objectAtIndex:0];        
        }

        for (UIView *subV in [cell.contentView subviews]){
            [subV removeFromSuperview];
        }    

        NSDictionary *hour = [[[eventsArray objectAtIndex:[indexPath section]] valueForKey:@"hours"] objectAtIndex:[indexPath row]];

        NSArray *events = [hour valueForKey:@"events"];

        cell.events = events;
        cell.timeLabel.text = [hour valueForKey:@"name"];

        int offset = 0;

        for(NSDictionary *event in events)
        {
            EventBoxViewController *ebvc = [[EventBoxViewController alloc] initWithNibName:@"EventBoxViewController" bundle:nil];
            ebvc.nameLabel.text = [event valueForKey:@"name"];

            [ebvc.view setFrame:CGRectMake(50, offset, 270, 44)];
            [cell.contentView addSubview:ebvc.view];

            offset += 44;
        }    

  return cell; 
 }

そして、それらは必要に応じてロードされません。下の画像をご覧ください。

ここに画像の説明を入力

セルをスクロールしたときにのみロードされますが、それでもロードされません。また、ラベルのテキストは割り当てられません。私が間違っていることについてのアイデアはありますか?

ありがとうございました。

4

3 に答える 3

4

ビューは cell.contentView に追加されます. セルは再利用可能であるため, まだ追加されたままです. すべてのサブビューを削除すると機能します.

for (UIView *subV in [cell.contentView subviews]){
     [subV removeFromSuperview];
}

の後に上記のコードを追加します

if (cell == nil) 
{
    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"EventsCell" owner:self options:nil];
    cell = [nib objectAtIndex:0];        
}
于 2012-10-07T19:40:37.080 に答える
0

より読みやすい解決策は、セルをデキューする代わりに毎回作成することですが、オーバーヘッドのために最終的にロードする必要があるセルの数によって異なります。この取り外しは厄介に見えます。

于 2015-03-02T17:43:37.480 に答える