0

リストを下にスクロールすると、すべての行が表示されますが、表示されるフレームに表示されるサブビューが増えるほど、サブビューが追加され続けます

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

UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:reuse];

if (cell == nil){
    cell = [[UITableViewCell alloc] initWithStyle: UITableViewCellStyleDefault reuseIdentifier:reuse];
}
NSUInteger row = indexPath.row;
[self createCell: cell onRow: row];
return cell;
}

 - (void) createCell: (UITableViewCell*)cell onRow: (NSUInteger)row
{
UIImageView* bgImage = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"cell_background_spade_active.png"]];
cell.backgroundView = bgImage;
cell.textLabel.hidden = YES;

UILabel* titleLabel = [[UILabel alloc] initWithFrame: CGRectMake(100, CGRectGetHeight(cell.frame) / 2, 200, 50)];
titleLabel.text = [[self.ruleList objectAtIndex: row] objectForKey: TitleKey];
titleLabel.backgroundColor = [UIColor clearColor];
[cell.contentView addSubview: titleLabel];
}
4

1 に答える 1

1

コードのセグメントcreateCell:内のみにあるほとんどすべてのロジックを実行する必要があると思います。if (cell == nil){現在呼び出している場所で実行する必要がある部分はcreateCell:、 への参照を取得してtitleLabelそのテキスト値を設定するだけです。

明確にするために、これが私が提案している種類の変更です (テストされていませんが、正しい考えを与えるはずです):

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

    UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:reuse];

    if (cell == nil){
        cell = [[UITableViewCell alloc] initWithStyle: UITableViewCellStyleDefault reuseIdentifier:reuse];
        [self setUpCell: cell];
    }
    NSUInteger row = indexPath.row;
    UILabel *titleLabel = (UILabel *)[cell.contentView viewWithTag:42];
    titleLabel.text = [[self.ruleList objectAtIndex: row] objectForKey: TitleKey];
    return cell;
}

- (void) setUpCell: (UITableViewCell*)cell
{
    UIImageView* bgImage = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"cell_background_spade_active.png"]];
    cell.backgroundView = bgImage;
    cell.textLabel.hidden = YES;

    UILabel* titleLabel = [[UILabel alloc] initWithFrame: CGRectMake(100, CGRectGetHeight(cell.frame) / 2, 200, 50)];
    titleLabel.tag = 42;
    titleLabel.backgroundColor = [UIColor clearColor];
    [cell.contentView addSubview: titleLabel];
}
于 2012-10-07T16:13:47.483 に答える