У меня была такая же проблема на iOS 7 и раскадровке, хотя у меня никогда не было этой проблемы с тем же кодом на старших версиях Xcode-SDK, и, пробуя множество предложений от stackoverflow, я не мог это исправить, и угадайте, что ?!Apple TableView Programming Guide содержит подробное руководство.Нет даже необходимости использовать cell==nil
.
. Таким образом, чтобы создать настраиваемую ячейку табличного представления с использованием раскадровки, которая будет правильно использоваться повторно, вы можете использовать два разных подхода.Я лично предпочитаю первый, который является более простым, но я поместил оба решения здесь.
Первый подход
- Создайте проект с помощью шаблона приложения Master-Detail и выберите параметр «Использовать раскадровки».
- На холсте раскадровки выберите главный контроллер вида.
- В инспекторе удостоверений убедитесь, что для класса задан пользовательский класс MasterViewController.
- Выберите представление таблицы внутри основного контроллера вида..
- В инспекторе атрибутов убедитесь, что во всплывающем меню «Содержимое» установлено значение «Динамические прототипы».
- Выберите ячейку прототипа.
- В инспекторе атрибутов выберите «Пользовательский».во всплывающем меню «Стиль».
- Введите идентификатор повторного использования в текстовое поле «Идентификатор».Это тот же идентификатор повторного использования, который вы отправляете в табличное представление в сообщении
dequeueReusableCellWithIdentifier:
. - Выберите «Индикатор раскрытия» во всплывающем меню «Аксессуар».
- Перетащите объекты из библиотеки в ячейку.,В этом примере перетащите два объекта метки и расположите их ближе к концам ячейки (оставляя место для дополнительного вида).
- Выберите объекты и установите их атрибуты, размеры и характеристики автоматического изменения размера.
Важным атрибутом для программной части этой процедуры является свойство tag
каждого объекта.Найдите это свойство в разделе View
Attributes inspector
и присвойте каждому объекту уникальное целое число.
Теперь напишите код, который вы обычно пишете, чтобы получить данные табличного представления.(Для этого примера единственными данными, которые вам нужны, является номер строки каждой ячейки.) Реализуйте метод источника данных tableView: cellForRowAtIndexPath: чтобы создать новую ячейку из прототипа и заполнить ее данными, аналогично следующему коду:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyIdentifier"];
UILabel *label;
label = (UILabel *)[cell viewWithTag:1];
label.text = [NSString stringWithFormat:@"%d", indexPath.row];
label = (UILabel *)[cell viewWithTag:2];
label.text = [NSString stringWithFormat:@"%d", NUMBER_OF_ROWS - indexPath.row];
return cell;
}
Обратите внимание на несколько аспектов этого кода:
- Строковый идентификатор, который вы присваиваете ячейке прототипа, - это та же строка, которую вы передаете в табличное представление в
dequeueReusableCellWithIdentifier:
. - Поскольку ячейка прототипа определена в раскадровке, метод
dequeueReusableCellWithIdentifier:
всегда возвращает действительную ячейку.Вам не нужно проверять возвращаемое значение по nil и создавать ячейку вручную. - Код получает метки в ячейке, вызывая
viewWithTag:
, передавая их целые числа тегов.Затем он может установить текстовое содержание меток.
Второй подход
Если вы предпочитаете не использовать тегиВы можете использовать альтернативный метод для установки содержимого в ячейке.Определите пользовательский подкласс UITableViewCell
со свойствами выхода для объектов, которые вы хотите установить.В раскадровке свяжите новый класс с ячейкой прототипа и подключите розетки к соответствующим объектам в ячейке.
Чтобы использовать розетки для пользовательского содержимого ячейки
- Добавьте класс Objective C с именем MyTableViewCell в ваш проект.
Добавьте следующий код к интерфейсу в MyTableViewCell.h
:
@ interface MyTableViewCell: UITableViewCell
@ свойство (неатомное, слабое) IBOutlet UILabel * firstLabel;@property (неатомный, слабый) IBOutlet UILabel * secondLabel;@ end
Добавьте следующий код к реализации в MyTableViewCell.m
:
@ syntheize firstLabel, secondLabel;
Добавьте следующую строку кода в исходный файл, который реализует источник данных:
# import "MyTableViewCell.h"
Используйте Identity inspector
, чтобы установить класс ячейки прототипа на MyTableViewCell
.
Используйте инспектор соединений, чтобы соединить два выхода в ячейке прототипа с соответствующими метками,
Реализация метода источника данных tableView:cellForRowAtIndexPath:
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
MyTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyIdentifier"];
cell.firstLabel.text = [NSString stringWithFormat:@"%d", indexPath.row];
cell.secondLabel.text = [NSString stringWithFormat:@"%d", NUMBER_OF_ROWS - indexPath.row];
return cell;
}
Код получает доступ к меткам в ячейке с помощью средства доступаметоды (здесь используется точечная запись).Затем код может установить текстовое содержание меток.