iOS xcode, добавляя подпредставление UILabel в пользовательскую ячейку таблицы, текст метки не обновляется на экране - PullRequest
0 голосов
/ 13 сентября 2011

Я создал пользовательский класс UITableViewCell и использовал метод layoutSubviews для добавления пользовательской метки. Как это:

- (void)layoutSubviews
{
    [super layoutSubviews];

    if (statusLabel == nil)
    {
        statusLabel = [[UILabel alloc]initWithFrame:CGRectMake(430.0, 10.0, 100.0, 20.0)];
        [statusLabel setTextAlignment:UITextAlignmentRight];
        [statusLabel setText:@"Status, set in code"];
        statusLabel.tag = 1;

        [self.contentView addSubview:statusLabel];
    }        
}

Как видите, я установил начальный текст метки на «Статус, задан в коде».

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

- (UITableViewCell *)tableView:(UITableView *)tableView
     cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{
    int index = [indexPath row];

    NSString *introducerString =[introducers objectAtIndex:index];
        NSArray *parts = [introducerString componentsSeparatedByString:@","];

    static NSString *MyIdentifier = @"Requester";
    UITableViewCell *cell = [tableView
                             dequeueReusableCellWithIdentifier:MyIdentifier];
    if (cell == nil) 
    {
        cell = [[[DanceCardCell alloc] initWithStyle:UITableViewCellStyleSubtitle
                                       reuseIdentifier:MyIdentifier] autorelease];
    }

    UIImage *image = [UIImage imageNamed:@"1.jpg"];
    [cell.imageView setImage:image];
    cell.textLabel.text = [parts objectAtIndex:1];
    cell.detailTextLabel.text = @"Some text";

    UILabel *statusLabel = (UILabel *)[cell viewWithTag:1];
    statusLabel.text = @"Did it!";

    return cell;
}

Я использую одно табличное представление для отображения двух списков, в зависимости от того, какая из двух кнопок нажата. При нажатии кнопки соответствующий контроллер табличного представления присоединяется к табличному представлению, и вызывается метод reloadData для запуска отображения новых данных. Новые данные отображаются, но текст пользовательской метки должен гласить «Сделал это!» читает «Состояние, задано в коде ...», пока я дважды не переключу списки.

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

Вот снимок экрана, чтобы продемонстрировать, что происходит: http://www.dsbsystems.co.uk/images/xcode1.png

1 Ответ

2 голосов
/ 13 сентября 2011

Вы инициализируете ячейку и сразу же пытаетесь найти statusLabel с тегом 1 внутри. У layoutSubviews еще не было возможности позвонить, поэтому ярлык не был создан и добавлен. (Я предлагаю переопределить назначенный метод инициализатора в ячейке табличного представления и создать там метку.)

Из-за этого, когда вы пытаетесь извлечь statusLabel, он становится nil, потому что такого представления нет, и обмен сообщениями (вызов метода on) nil просто ничего не делает (на самом деле, он возвращает nil). Вам нужно следить за тем, как это продвигается вперед, если вы привыкли к вещам, взрывающимся, например, от исключение нулевой ссылки.

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

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