2013-03-15 1 views
4

У меня есть вытаскивание волос. Я просто пытаюсь создать таблицу с стилем UITableViewCellStyleSubtitle с текстом и деталями. Но детали не появляются. Обычно это происходит потому, что кто-то забыл инициализировать ячейки с правильным стилем, но в этом случае это не так. Я пробовал все четыре стили ячеек, и детали не отображаются ни в одном из них, хотя текстовая метка перемещается вправо, когда я использую UITableViewCellStyleValue2.Почему мой UITableViewCell не показывает detailTextLabel в ЛЮБОМ стиле?

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

Я сводился ключевым методом это:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    // Get the UITableViewCell (out of the recycling pool, or de novo) 
    NSString *reuseID = @"CELL"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:reuseID]; 
    if (not cell) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue2 reuseIdentifier:reuseID] autorelease]; 
    } 

    cell.textLabel.text = @"Foo"; 
    cell.detailTextLabel.text = @"Bar"; 
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 
    cell.detailTextLabel.frame = CGRectMake(10, 20, 200,22);  // required 
    cell.detailTextLabel.font = [UIFont boldSystemFontOfSize:12]; // also required 
    //[cell setNeedsLayout]; (makes no difference) 
    return cell; 
} 

Я могу видеть текст подробно, только если я включаю ОБА «необходимые» строки выше (и использовать любой тип клеток, кроме по умолчанию) , и даже когда я это делаю, позиция текстовой метки полностью перекрывает положение метки метки.

Таким образом, кажется, что инициализатор создает detailTextLabel UILabel, но устанавливает его размер шрифта в ноль и его фрейм на что-то пустое или вне экрана. (Я попытался проверить их в отладчике, но это не очень полезно - размер шрифта равен нулю, а кадр пуст для BOTH textLabel и detailTextLabel, но textLabel всегда отображается нормально.)

Очевидно, что я могу обходите его, если нужно, вручную отрегулировав размеры и шрифты этикеток. Но мне очень мешает, что мне нужно сделать это в этом случае, когда обычно вы просто устанавливаете стиль, а текст и макет автоматически. Я искал googles и переполнения стека, но не могу найти ссылку на аналогичную проблему. Кто-нибудь знает, что здесь происходит?

(Тестирование под прошивкой 6.1.)

+0

Вы используете раскадровки? Если это так, вам нужно установить свойство Subtitle в IB для ячейки. Это должно отобразить detailTextLabel. Раньше у меня была эта проблема. –

+0

Нет, нет раскадровки или XIB, если на то пошло. Просто код. –

+0

И я ошибся выше, когда сказал, что могу обойти это, изменив фрейм ... Я могу изменить detailTextLabel.frame, но все мои попытки изменить textLabel.Frame не имеют никакого эффекта. Истина как в cellForRowAtIndexPath, так и в tableView: willDisplayCell: forRowAtIndexPath. Сама ячейка, похоже, борется со мной в отношении textLabel и полностью игнорирует detailTextLabel. –

ответ

1

я надеюсь, что это будет поможет вам, как только проверить его

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

    static NSString *CellIdentifier = @"Cell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease]; 
    } 
    cell.textLabel.text = @"Foo"; 
    cell.detailTextLabel.text = @"Bar"; 
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 
    cell.textLabel.frame = CGRectMake(10, 20, 100,22);   
     return cell; 
} 

операции, такие как размер шрифта, цвет фона меняется cell.labels эти все функциональные возможности вы должны делать это ниже.

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath{ 
    cell.detailTextLabel.font = [UIFont boldSystemFontOfSize:10]; 
    cell.textLabel.backgroundColor=[UIColor redColor]; 
    cell.textLabel.frame = CGRectMake(10, 20, 100,22); 
    cell.detailTextLabel.frame = CGRectMake(10, 20, 200,22); 

} 

если вы изменяете эти типы свойств в cellForRowAtIndexPath этот метод, то вы потеряли эти свойства.

+0

Благодарим вас за помощь. Но как отмечено в комментарии к исходному вопросу, изменение рамки textLabel не работает, выполняю ли я его в cellForRowAtIndexPath или в willDisplayCell. И, как это бывает, изменение рамки detailTextLabel * работает * в любом месте. –

3

ОК, выясняется, что в этом приложении у нас очень необычный процесс сборки, который неправильно идентифицировал SDK, приложение было создано против структуры Cocoa.

В результате Cocoa считал, что это очень старое приложение - от дней до iOS4, до того, как была добавлена ​​детальTextLabel. Таким образом, структура пыталась быть полезной, эмулируя поведение pre-iOS4 (скрывая detailTextLabel несколькими способами). Установка точки останова на _UIApplicationLinkedOnOrAfter и принудительное ее возвращение 1 позволила мне взломать эту функцию и доказать, что это было причиной. (И теперь нам просто нужно исправить наш процесс сборки, чтобы сообщить правильную версию SDK.)

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

16

Перепробовав все эти вещи, когда я установил стиль таблицы вид ячейки для «Subtitle» в раскадровке, подзаголовок появился для меня IB Storyboard Cell setting

+0

это сработало! upvoted! – kamyFC

5

Регистрация стандартный класс UITableViewCell мешает вам с использованием стилизованных UITableViewCells, потому что этот код блок никогда не будет выполнен

if (not cell) { 
    // .... Cell will never be nil if a class/nib is registered 
} 

Решения: вы регистрация пера или класса для вашего Tableview? Если у вас есть строка, как в следующем, вы должны удалить это

[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:kMCControlsCellIdentifier]; 

и обновить DEQUEUE заявление, как следует

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kMCControlsCellIdentifier]; 
if (cell == nil) { 

    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:kMCControlsCellIdentifier]; 
} 
0

Проблема в том, вы, скорее всего, зарегистрировали клетку с помощью

[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"CELL"]; 

Значение

if (not cell) { 
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue2 reuseIdentifier:reuseID] autorelease]; 
} 

никогда не будет вызван, потому что ячейка никогда не будет равна нулю. Поэтому ячейка всегда будет инициализирована таблицей UITableViewCellStyleNone.

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

(id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier 

.

Это работает для меня:

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

    } 
    return self; 
}