UITableViewCell меняет значение метки при каждой прокрутке - PullRequest
1 голос
/ 29 октября 2019

У меня есть reusableCell, у которого есть метка, для которой значения предоставляются массивом. Но значения метки и ограничений меняются каждый раз, мой код cellForRowAtIndexPath выглядит так:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
     if(indexPath.row % 2 == 0)
    {
        isReceived =TRUE;
    }
     else{
        isReceived = FALSE;
    }
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"id" forIndexPath:indexPath];

    ChatMessageCellTableViewCell *messageCell = (ChatMessageCellTableViewCell*) cell;
    if(messageCell == nil) {
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"ChatMessageCellTableViewCell" owner:self options:nil];

        messageCell = [nib objectAtIndex:0];
    }
    else{
        [[messageCell formLabel]setText:messages[indexPath.row]];
        [messageCell setSelectionStyle:UITableViewCellSelectionStyleNone];
    } // this else part is just to make sure that the if has a else part as I saw many people it will work , but in my case it didn't help.

    [[self tableView] setEstimatedRowHeight:50.0];
    [self.tableView setRowHeight:UITableViewAutomaticDimension];

    return messageCell;
}

Когда я прокручиваю таблицу, значения меняются. Я пытался по-разному, но не смог найти решение, и я так растерялся, что мне пришлось опубликовать свой вопрос.

Спасибо

Ответы [ 3 ]

1 голос
/ 30 октября 2019

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

Мне удалось избежать этих изменений, изменив метод cellForRowAtIndexPath

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

    NSString *cellIdentifier = (indexPath.row % 2 == 0 ? @"EvenCell" : @"OddCell"); //using different identifier for every cell did the trick I guess
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    ChatMessageCellTableViewCell *messageCell = (ChatMessageCellTableViewCell*) cell; ;
    if (messageCell == nil) {
        messageCell = [[ChatMessageCellTableViewCell alloc] initWithStyle: UITableViewCellStyleDefault
            reuseIdentifier:cellIdentifier];
        if(indexPath.row % 2 == 0)
        {
            isReceived =TRUE;
        }
        else{
            isReceived = FALSE;
        }
    }

        [[messageCell formLabel]setText:messages[indexPath.row]];
        [messageCell setSelectionStyle:UITableViewCellSelectionStyleNone];

    [[self tableView] setEstimatedRowHeight:50.0];
    [self.tableView setRowHeight:UITableViewAutomaticDimension];

    return messageCell;
}

Я прокомментировализменения, которые я внес, чтобы предотвратить изменения в ячейке при прокрутке.

Спасибо за поддержку :)

0 голосов
/ 29 октября 2019

Я не знаком с Obj-C, но это может помочь вам.

if youHaveTitleText {
cell.title.text = data.displayText
} else {
cell.title.text = ""
}
0 голосов
/ 29 октября 2019

В вашем коде неверная логика, ваш код назначает данные только для повторно используемой ячейки, но не для новой созданной ячейки. Вы должны переместить код в другие скобки следующим образом.

ChatMessageCellTableViewCell *messageCell = (ChatMessageCellTableViewCell*) cell;
if(messageCell == nil) {
    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"ChatMessageCellTableViewCell" owner:self options:nil];

    messageCell = [nib objectAtIndex:0];
}
[[messageCell formLabel]setText:messages[indexPath.row]];
[messageCell setSelectionStyle:UITableViewCellSelectionStyleNone];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...