проблема настройки UITableViewCell - PullRequest
0 голосов
/ 03 апреля 2012

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

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

    UILabel *username;
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
        cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton;

        username = [[UILabel alloc] initWithFrame:CGRectMake(0.0, 0.0, 120.0, 20.0)];
        username.tag = USERNAME_TAG;
        username.font = [UIFont systemFontOfSize:14.0];
        username.textAlignment = UITextAlignmentLeft;
        username.textColor = [UIColor blackColor];
        username.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleHeight;
        [cell.contentView addSubview:username];
    } else {
        username = (UILabel *)[cell.contentView viewWithTag:USERNAME_TAG];
    }

    //NSDictionary *photos = [self.photos objectAtIndex:indexPath.row];
    username.text = @"Testing!";

    return cell;
}

Я получил этот шаблонный код от здесь

Однако, когда я запускаю код, в ячейке нет текстовой метки, но аксессуар появляется.

Ответы [ 3 ]

1 голос
/ 03 апреля 2012

Я считаю, что гораздо проще использовать пользовательский xib для ячеек таблицы, которые не поддаются ни одному из нормальных типов. Основные шаги: создайте xib со своей строкой, создайте свойство outlet, затем в своем методе cellForRowAtIndexPath вызовите loadNibNamed и присвойте его локальной переменной (которую вы возвращаете), а затем установите на выходе значение nil.

Секрет в том, что при загрузке кончика с нулевым выходом происходит инициализация и наполнение нулевого выхода содержимым кончика.

Описано здесь (выделите Загрузка пользовательских ячеек табличного представления из файлов пера): http://developer.apple.com/library/ios/#documentation/UserExperience/Conceptual/TableView_iPhone/TableViewCells/TableViewCells.html#//apple_ref/doc/uid/TP40007451-CH7

Если вам нужно много взаимодействия с пользователем, вам, вероятно, лучше подклассифицировать UITableViewCell и снабдить его собственным xib. Если у вас много элементов управления в ячейке, вы в конечном итоге будете использовать теги для определения источника событий, который запутывается с несколькими тегами.

0 голосов
/ 03 апреля 2012

Apple изменила поведение dequeueReusableCellWithIdentifier, когда они выпустили 5.0.

В 5.0+ гарантированно всегда будет возвращаться копия вашей ячейки (если она есть в вашей xib / раскадровке), даже если вы еще не загрузили ячейку. До этого он возвращал бы ячейку только , если бы была ячейка, которая была готова к переработке.

Из-за этого старый код, предполагающий, что вы получите ноль, если вы его уже не инициализировали, сломается.

Итак, избавьтесь от идентификатора (или всей ячейки) в вашей xib / раскадровке или измените свою логику так, чтобы она инициализировала ее при необходимости (возможно, в зависимости от того, существует ли представление с указанным тегом).

0 голосов
/ 03 апреля 2012

Похоже, вы просто пытаетесь добавить "стандарт" UILabel к UITableViewCell.

Вот что вы делаете: каждый UITableViewCell из UITableViewCellStyleDefault имеет свойство, называемое textLabel. В своем коде сделайте следующее:

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

    UILabel *username;
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
        cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton;
    }
    cell.textLabel.text = @"Testing!";

    return cell;
}

PS: Похоже, вы пытаетесь добавить изображение в какой-то момент? Для этого тоже есть свойство. Посмотрите документацию для свойства imageView.

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