Объединение статического и прототипного содержимого в виде таблицы

Есть ли способ объединить статические ячейки таблицы (статический контент) с динамическими ячейками таблицы (содержимое прототипа) с помощью раскадровки?

Я предлагаю вам рассматривать вашу таблицу как динамическую, но включать ячейки, которые вы всегда хотите вверху. В Раскадке поместите UITableViewController и используйте динамическую таблицу. Добавьте как можно больше прототипов UITableViewCell в таблицу. Скажем, по одному для ваших статических ячеек, и один для представления переменных ячеек.

В вашем классе UITableViewDataSource :

 #define NUMBER_OF_STATIC_CELLS 3 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return [self.dynamicModel count] + NUMBER_OF_STATIC_CELLS; } 

а потом

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { if (indexPath.row < NUMBER_OF_STATIC_CELLS) { // dequeue and configure my static cell for indexPath.row NSString *cellIdentifier = ... // id for one of my static cells } else { // normal dynamic logic here NSString *cellIdentifier = @"DynamicCellID" // dequeue and configure for [self.myDynamicModel objectAtIndex:indexPath.row] } } 

У меня была проблема, хотя это был небольшой вариант. Я действительно хотел смешивать динамические и статические ячейки, но в разных группах. Значение группы 1 будет иметь только статические ячейки, а группа 2 будет иметь динамические ячейки.

Я выполнил это путем на самом деле жесткого кодирования значений статических ячеек (на основе их прототипов идентификаторов ячеек). Динамические разделы будут иметь нормальный динамически заполненный контент. Вот пример кода на тот случай, если кто-то другой имеет такую ​​же проблему:

 - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { if (section == 1){ return @"Dynamic Cells"; } if (section == 0){ return @"Static Cells"; } } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { if (section == 0) { return 1; //However many static cells you want } else { return [_yourArray count]; } } -(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath { if (indexPath.section == 0) { NSString *cellIdentifier = @"staticCellType"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]; } cell.textLabel.text = @"some static content"; return cell; } else if (indexPath.section == 1){ NSString *cellIdentifier = @"dynamicCellType"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]; } cell.textLabel.text = [_yourArray objectAtIndex:indexPath.row]; return cell; } return nil; } - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return 2; } 

Вы всегда можете сделать то, что ваши табличные представления выглядят похожими на статическую таблицу, но определяют ее в коде. Задайте разделы, количество или строки в каждом разделе, заголовки и т. Д. С помощью методов делегата.

К сожалению, это невозможно, так как статические представления таблиц должны быть в UITableViewController и это разрешает только один просмотр таблицы.

Что вам нужно сделать, это сделать еще три динамических UITableviewCell и загрузить их по отдельности для первых трех строк, где вы хотите статический контент.

Если вы не знаете, как это сделать, сообщите мне, и я найду код.

Поскольку никто не дал реального ответа на проблему (используя как статические, так и прототипные ячейки в одном и том же представлении таблицы), я подумал, что я буду звонить. Это можно сделать!

Создайте свои статические ячейки по своему усмотрению. Для разделов, которым нужна динамическая ячейка, если вы НЕ используете стандартный тип UITableViewCell, вам нужно создать свой собственный в отдельном Nib, иначе вы можете использовать стандартные. Затем выполните следующие делегаты. В основном для каждого из этих делегатов, для статического материала, который мы хотим назвать супер, для динамического мы возвращаем наши значения.

Во-первых, ЕСЛИ вам нужно выборочно показать свой динамический раздел, вы захотите реализовать numberOfSectionsInTableView (иначе вы можете оставить этот делегат):

 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { int staticSections = 1; int dynamicSections = 1; if(SOME_BOOLEAN) { return staticSections + dynamicSections; }else { return staticSections; } } 

Затем вам необходимо реализовать numberOfRowsInSection:

 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { if(section == 2) { return A_COUNT; }else { return [super tableView:tableView numberOfRowsInSection:section]; } } 

Затем вам нужно реализовать heightForRowAtIndexPath:

 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { if(indexPath.section == 2) { return 44.0f; }else { return [super tableView:tableView heightForRowAtIndexPath:indexPath]; } } 

Затем indentationLevelForRowAtIndexPath:

 - (NSInteger)tableView:(UITableView *)tableView indentationLevelForRowAtIndexPath:(NSIndexPath *)indexPath { if(indexPath.section == 2) { return 1; }else { return [super tableView:tableView indentationLevelForRowAtIndexPath:indexPath]; } } 

Наконец, cellForRowAtIndexPath:

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { if(indexPath.section == 2) { SomeObject *obj = self.someArray[indexPath.row]; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"DynamicCell" forIndexPath:indexPath]; cell.textLabel.text = obj.textValue; return cell; }else { return [super tableView:tableView cellForRowAtIndexPath:indexPath]; } } 

У вас не может быть один столбец статичным, а другой – динамиком в одном и том же контроллере, поэтому вам нужно будет сделать их динамичными. В первом представлении таблицы вы настроите ячейки в коде при инициализации контроллера просмотра, никогда не обновляя их.

  1. Добавьте UIViewController в свою раскадровку.
  2. Добавьте два представления таблиц (не TableViewControllers) в UIView Controller.
  3. Выберите каждый tableView и настройте оба для динамических ячеек.
  4. Создайте и прикрепите контроллер вида. 2 tableview на одном представлении объясняет этот шаг.

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

Вы также можете создавать кнопки (по одному для каждой статической ячейки, которые у вас есть), которые стилизованы как ваши ячейки, и помещают их в tableHeaderView или tableFooterView из UITableView; эти кнопки – это просто взгляды.

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

Конечно, это предполагает, что вы хотите вставить статические ячейки в свой вид таблицы вверху или внизу таблицы.

Один из способов динамического содержимого в представлении статической таблицы – клонировать ячейки, где необходимы дополнительные строки.

Для динамического раздела моего представления таблицы я выкладываю одну или несколько ячеек в Interface Builder. Во время выполнения я могу клонировать их путем архивирования с использованием NSCoder, а затем для разборки.

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

Он не работает со стандартными ячейками таблицы. Ленько созданные текстовые метки не выложены правильно. Следовательно, я использовал подклассы UITableViewCell, где я занимаюсь архивированием и разборчиками.

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { if (indexPath.section == kContactsSection) { NSArray *contacts = self.contacts; Contact *contact = [contacts objectAtIndex:indexPath.row]; NSString *name = contact.name; NSString *role = contact.role; if ([role length] == 0) { NNContactDefaultTableViewCell *cell = (id)[tableView dequeueReusableCellWithIdentifier : @"contactDefault"]; if (cell == nil) { NNContactDefaultTableViewCell *template = (id)[super tableView : tableView cellForRowAtIndexPath :[NSIndexPath indexPathForRow:0 inSection:kContactsSection]]; NSData *data = [NSKeyedArchiver archivedDataWithRootObject:template]; cell = [NSKeyedUnarchiver unarchiveObjectWithData:data]; } cell.contactTextLabel.text = name; return cell; } else { NNContactDetailTableViewCell *cell = (id)[tableView dequeueReusableCellWithIdentifier : @"contactDetail"]; if (cell == nil) { NNContactDetailTableViewCell *template = (id)[super tableView : tableView cellForRowAtIndexPath :[NSIndexPath indexPathForRow:1 inSection:kContactsSection]]; NSData *data = [NSKeyedArchiver archivedDataWithRootObject:template]; cell = [NSKeyedUnarchiver unarchiveObjectWithData:data]; } cell.contactTextLabel.text = name; cell.contactDetailTextLabel.text = role; return cell; } } return [super tableView:tableView cellForRowAtIndexPath:indexPath]; } 

В приведенном выше примере у меня есть два типа ячеек. Оба изложены в интерфейсе Builder как часть статического представления таблицы.

Чтобы получить динамический контент в одном разделе, мне также необходимо переопределить следующие методы:

 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { if (section == kContactsSection) { NSArray *contacts = self.contacts; NSUInteger contactCount = [contacts count]; return contactCount; } return [super tableView:tableView numberOfRowsInSection:section]; } - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { NSInteger section = indexPath.section; NSInteger row = indexPath.row; if (section == kContactsSection) { return [super tableView:tableView heightForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:kContactsSection]]; } return [super tableView:tableView heightForRowAtIndexPath:indexPath]; } - (CGFloat)tableView:(UITableView *)tableView indentationLevelForRowAtIndexPath:(NSIndexPath *)indexPath { NSInteger section = indexPath.section; if (section == kContactsSection) { CGFloat indentation = [super tableView:tableView indentationLevelForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:kContactsSection]]; return indentation; } CGFloat indentation = [super tableView:tableView indentationLevelForRowAtIndexPath:indexPath]; return indentation; } 
  • Как скрыть заголовок UITableView, а затем снова открыть его?
  • Скрыть UIView, начиная с Bottom on Scroll
  • Использование одного и того же View Controller для добавления, отображения и редактирования
  • UITableViewHeaderFooterView: невозможно изменить цвет фона
  • как немедленно изменить UIProgressView на UITableViewCell?
  • как проверить, когда UITableView выполняется прокрутка
  • Автозапуск игнорируется в пользовательском UITableViewCell
  • TableView Cell Пользовательский тип Text Overlaps сам или пуст
  • Отключить жестов для перехода по экрану в UITableView
  • Возможно ли создать не полный экран UITableView с помощью раскадровки?
  • Как оживить изменение высоты заголовка раздела в UITableView?
  • Давайте будем гением компьютера.