Настройка стиля UITableViewCell при использовании iOS 6 UITableView dequeueReusableCellWithIdentifier:forIndexPath:
Я пытаюсь выяснить, как установить UITableViewCellStyle при использовании новых методов в iOS 6 для UITableView.
ранее, при создании UITableViewCell Я бы поменял UITableViewCellStyle перечисление для создания различных типов ячеек по умолчанию при вызове initWithStyle: но из того, что я могу собрать, это уже не так.
документация Apple для UITableView гласит:
Возвращаемое Значение:
Объект инструменту UITableViewCell с соответствующим идентификатор повторного использования. Этот метод всегда возвращает ячейку.
Обсуждение:
По соображениям производительности источник данных табличного представления обычно должен повторно использовать объекты UITableViewCell, когда он назначает ячейки строкам в своем tableView: cellforrowatindexpath: метод. Табличное представление поддерживает очередь или список объектов UITableViewCell, помеченных источником данных для повторного использования. Вызовите этот метод из объекта источника данных при запросе предоставить новую ячейку для представления таблицы. Этот метод удаляет существующую ячейку, если она доступна, или создает новую на основе ранее зарегистрированного файла класса или nib.
важно: перед вызовом этого метода необходимо зарегистрировать класс или файл nib с помощью метода registerNib:forCellReuseIdentifier: или registerClass:forCellReuseIdentifier:.
если вы зарегистрировали класс для указанного идентификатора и необходимо создать новую ячейку, этот метод инициализирует ячейку с помощью называя его initWithStyle:reuseIdentifier: метод. Для ячеек на основе nib этот метод загружает объект ячейки из предоставленного файла nib. Если существующая ячейка была доступна для повторного использования, этот метод вызывает метод prepareForReuse ячейки.
вот как мой новый cellForRowAtIndexPath следит за реализацией новых методов:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *cellIdentifier = @"cell_identifier";
[tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:cellIdentifier];
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];
return cell;
}
код у меня до сих пор работает нормально, но всегда возвращает стиль по умолчанию. Как я могу изменить это, чтобы я мог создавать ячейки с другими стили, такие как UITableViewCellStyleDefault,UITableViewCellStyleValue1,UITableViewCellStyleValue2 и UITableViewCellStyleSubtitle?
Я не хочу подкласс UITableViewCell, Я просто хочу изменить тип по умолчанию, как я мог бы сделать до iOS 6. Кажется странным, что Apple предоставит расширенные методы, но с минимальной документацией для поддержки их реализации.
кто-нибудь освоил это или столкнулся с подобной проблемой? Я изо всех сил пытаюсь найти любую разумную информацию вообще.
6 ответов:
Я знаю, вы сказали, что не хотите создать подкласс, но это выглядит неизбежным. На основе ассемблерного кода при тестировании в симуляторе iOS 6.0,
UITableViewсоздает новые экземплярыUITableViewCell(или его подклассы) путем выполнения[[<RegisteredClass> alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:<ReuseIdentifier>]другими словами, отправленный стиль (
UITableViewCellStyleDefault), кажется, жестко закодированы. Чтобы обойти это, вам нужно будет создать подкласс, который переопределяет инициализатор по умолчаниюinitWithStyle:reuseIdentifier:и передает стиль, который вы хотите использование:- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { // ignore the style argument, use our own to override self = [super initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:reuseIdentifier]; if (self) { // If you need any further customization } return self; }кроме того, может быть, лучше отправить
registerClass:forCellReuseIdentifier:наviewDidLoad, вместо того, чтобы делать это каждый раз просила ячейка:- (void)viewDidLoad { [super viewDidLoad]; [self.tableView registerClass:<RegisteredClass> forCellReuseIdentifier:<ReuseIdentifier>]; }
dequeueReusableCellWithIdentifierне является устаревшим, так что вы не обязаны использовать новыйdequeueReusableCellWithIdentifier:forIndexPath:.используйте новый способ вместе с соответствующим методом register (в viewDidLoad), если вы используете пользовательский класс ячеек, но используйте старый способ, если вы хотите использовать одно из перечислений UITableViewCellStyle.
вы можете избежать постороннего подкласса с помощью storyboard interface builder:
- в представлении раскадровки выберите ячейку прототипа ячейки табличного представления (в представлении таблицы)
- в представлении утилиты в инспекторе атрибутов измените значение стиля
- (необязательно) изменить другие значения, такие как выбор и аксессуар
новая iOS 6.0
dequeueReusableCellWithIdentifier:forIndexPath:использует эти значения при выделении новых ячеек и их возврате. (Протестировано на компиляции iOS 6.0 с использованием Xcode 4.5.2)
еще одна альтернатива, которая сохраняет один файл-создать перо и использовать
registerNib:forCellReuseIdentifier:вместо.создание пера легко: создать новый .xib файл в Interface Builder. Удалите представление по умолчанию. Добавьте объект ячейки табличного представления. С помощью инспектора атрибутов измените стиль ячейки. (Здесь у вас также есть возможность дополнительно настроить ячейку, настроив другие атрибуты.)
затем в вашем контроллере табличного представления
viewDidLoadвызов метода что-то например:[self.tableView registerNib:[UINib nibWithNibName:@"StyleSubtitleTableCell" bundle:[NSBundle mainBundle]] forCellReuseIdentifier:@"Cell"];
ответ болота правильный. Простой и вам не нужно создавать какой-либо XIB файл.
Я просто хотел обновить свой ответ для тех, кто делает это с помощью Swift вместо Objective-C:
override init(style: UITableViewCellStyle, reuseIdentifier: String?) { super.init(style: .value1, reuseIdentifier: reuseIdentifier) } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") }
мое решение заключается в том, чтобы позвонить
initWithStyle: reuseIdentifier:после того, как я получил его с помощью[self.tableView dequeueReusableCellWithIdentifier:@"cellId" forIndexPath:indexPath]. В конце концов,init- это просто еще один селектор, и компилятор не накладывает никаких ограничений на его вызов для уже инициализированного объекта. Однако он будет жаловаться на то, что не использует результат вызова init, поэтому я делаю:UITableViewCell* cell = [self.tableView dequeueReusableCellWithIdentifier:@"cellId" forIndexPath:indexPath]; cell = [cell initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"cellId"];Я думаю, что это не будет работать в Swift...
Comments