Кажется, содержимое cellLabel.text перезаписывается в случайных ячейках - PullRequest
1 голос
/ 11 сентября 2010

У меня есть UITableView, который заполняется из массива NSMutable, в котором 79 записей. Когда я запускаю свое приложение и прокручиваю таблицу вниз, кажется, что в одной ячейке несколько записей. Похоже, это происходит примерно на половине экрана ниже высоты стола.

Например:

Один объект в массиве - @ "Dog", а другой - @ "Cat". В одной ячейке вы можете видеть как кошку, так и собаку, написанную в тексте cellLabel.

Код для инициации клеток

// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
        cell.accessoryType = UITableViewCellAccessoryNone;
    }

    // Configure the cell...

    UILabel *cellLabel = [[[UILabel alloc] initWithFrame:cell.frame] autorelease];
    cellLabel.text = [symptomsArray objectAtIndex:indexPath.row];
    cellLabel.textColor = [UIColor blackColor];
    cellLabel.backgroundColor = [UIColor clearColor];
    cellLabel.opaque = NO;
    [cell.contentView addSubview:cellLabel];
    cell.contentView.backgroundColor = [UIColor colorWithRed:(214.0/255) green:(215.0/255.0) blue:(217.0/255) alpha:1.0];

    return cell;
}

Ответы [ 5 ]

1 голос
/ 03 октября 2012
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:nil];
if (cell == nil) {
 cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil] autorelease];
}

Убедитесь, что "dequeueReusableCellWithIdentifier" и "reuseIdentifier" должны быть "nil"

Теперь это будет работать !!

1 голос
/ 11 сентября 2010

Подвиды расположены относительно границ своих суперпредставлений. Так, например, если вы хотите, чтобы cellLabel находился в верхнем левом углу представления содержимого, вам нужно установить его источник в (0, 0). Вы используете рамку ячейки, которая относится к верхнему левому углу представления таблицы.

Когда вы прокручиваете вниз, UITableView повторно использует старые ячейки, и вы добавляете дополнительные метки в эти ячейки. Эти ячейки имеют кадры с началом координат, смещенным на один или два экрана сверху таблицы, поэтому вы размещаете новые метки вне фактических границ ячейки. Вот как это исправить.

static int CellLabelTag = 12345;

if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    cell.accessoryType = UITableViewCellAccessoryTypeNone;

    UILabel *cellLabel = [[[UILabel alloc] initWithFrame:cell.contentView.bounds] autorelease];
    cellLabel.tag = 585493;
    [cell.contentView addSubview:CellLabelTag];
}

UILabel *cellLabel = (UILabel *)[cell viewWithTag:CellLabelTag];
cellLabel.text = // your text here
// blah blah blah configuration
return cell;
1 голос
/ 11 сентября 2010

Сохраняйте это простым.

Если у вас есть только несколько записей, почему бы не выделить массив ячеек перед загрузкой и загрузить объект ячейки из массива непосредственно внутри:

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

 return [arrayOfCells objectAtIndex:indexPath.row]; //already allocated one single time at the beginning

    }

Больше нет dequeueReusableCellWithIdentifier ..

Будьте проще!

1 голос
/ 11 сентября 2010

Это потому, что вы добавляете метку каждый раз. Если вам действительно нужен этот новый UiLabel, добавьте его в предложение if и измените его текст из if

. Чтобы сделать это эффективно, у вас будетдля подкласса UITableViewCell может быть

Надеюсь, это поможет

0 голосов
/ 03 января 2013

Алекс ответ здесь лучший, многие люди не понимают, что это происходит, особенно если они не используют фон ClearColor для меток, и в этом случае вы никогда не увидите перезаписи.

Мое предпочтительное решение - создать пользовательскую ячейку со свойствами, которые вы хотите. Так что в этом случае вы бы создали

@interfacce MyCustomCell : UITableViewCell
    @property (nonatomic) UILabel *cellLabel;
@end

Присвойте ему свойство UILabel * cellLabel и сделайте весь код, который у вас есть, кроме установки текста меток в инициализации MyCustomCell.m, замените все экземпляры ячейки на self, например:

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];

    if (self)
    {
        self.cellLabel = [[UILabel alloc] initWithFrame:cell.frame];
        self.cellLabel.textColor = [UIColor blackColor];
        self.cellLabel.backgroundColor = [UIColor clearColor];
        self.cellLabel.opaque = NO;
        [self..contentView addSubview:cellLabel];
        self.contentView.backgroundColor = [UIColor colorWithRed:(214.0/255) green:(215.0/255.0) blue:(217.0/255) alpha:1.0];
    }

    return self;
}

Теперь в вашем cellForRowAtIndexPath используйте MyCustomCell, где вы проверяете, имеет ли cell == nil, вы также можете проверить метку ячейки:

if(cell == nil || cell.cellLabel == nil)

Инициализируйте его точно так же:

cell = [[MyCustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];

Теперь все, что вам нужно сделать, это установить:

cell.cellLabel.text = [symptomsArray objectAtIndex:indexPath.row];

ваш код в cellForRowAtIndexPath намного чище, эффективнее с памятью, и вы не получите свою ошибку.

Не забудьте установить в ячейке вашего типа тип MyCustomCell в конструкторе интерфейсов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...