UITableView Mix из статических и динамических ячеек?
Я знаю, что вы не можете смешивать типы статических и динамических ячеек в одном UITableView
, но я не мог придумать, как лучше описать мою проблему.
У меня есть несколько предопределенных ячеек с фиксированным контентом, у меня также есть неизвестное количество ячеек с динамическим содержимым, которое находится посередине. Поэтому я хочу, чтобы мой стол выглядел примерно так:
Fixed
Fixed
Fixed
Dynamic
Dynamic
Dynamic
Dynamic
Dynamic
Fixed
Fixed
Итак, как именно вы порекомендовали мне подход к этому в моем методе cellForRowAtIndexPath
?
Спасибо.
Ответы
Ответ 1
Как вы заявили, вы не можете смешивать статические и динамические ячейки. Однако вы можете разбить содержимое на разные массивы данных, соответствующие каждой группе. Затем разбивайте таблицу на разделы разности и загружайте данные из правильного массива в cellForRowAtIndexPath:.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *cellID = @"CELLID";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID forIndexPath:indexPath];
switch (indexPath.section) {
case 0:{
cell.textLabel.text = self.arrayOfStaticThings1[indexPath.row];
}break;
case 1:{
cell.textLabel.text = self.arrayOfDynamicThings[indexPath.row];
}break;
case 2:{
cell.textLabel.text = self.arrayOfStaticThings2[indexPath.row];
}break;
default:
break;
}
return cell;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
switch (section) {
case 0:{
return self.arrayOfStaticThings1.count;
}break;
case 1:{
return self.arrayOfDynamicThings.count;
}break;
case 2:{
return self.arrayOfStaticThings2.count;
}break;
default:
return 0;
break;
}
}
Ответ 2
После борьбы за 1 день нашли лучшее решение
Обновлено для Swift 4
для случая вопроса:
- Установить разделы таблицыView в 3
![enter image description here]()
-
Добавьте пустую ячейку tableview во второй раздел, который вы хотите применить к динамическим ячейкам, измените идентификатор ячейки как WiFiTableViewCell
-
создать новый XIB файл с именем WiFiTableViewCell
![enter image description here]()
-
зарегистрируйте Nib в функции ViewDidLoad в tableViewController
tableView.register(UINib(nibName: "WiFiTableViewCell", bundle: nil), forCellReuseIdentifier: "WiFiTableViewCell")
-
добавьте следующий код для использования как динамической, так и статической ячейки
override func numberOfSections(in tableView: UITableView) -> Int
{
return 3
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if section == 1 {
return self.dataSource.count
//the datasource of the dynamic section
}
return super.tableView(tableView, numberOfRowsInSection: section)
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
if indexPath.section == 1 {
let cell = tableView.dequeueReusableCell(withIdentifier: "WiFiTableViewCell") as! WiFiTableViewCell
return cell
}
return super.tableView(tableView, cellForRowAt: indexPath)
}
override func tableView(tableView: UITableView, indentationLevelForRowAtIndexPath indexPath: NSIndexPath) -> Int {
if indexPath.section == 1 {
let newIndexPath = IndexPath(row: 0, section: indexPath.section)
return super.tableView(tableView, indentationLevelForRowAt: newIndexPath)
}
return super.tableView(tableView, indentationLevelForRowAt: indexPath)
}
override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
if indexPath.section == 1 {
return 44
}
return super.tableView(tableView, heightForRowAt: indexPath)
}
Ответ 3
Лучший и простой способ
1) Разместите два контейнера в заголовке и в нижнем колонтитуле динамического TableView
2) Назначьте Static TableViews этим контейнерам и отпустите "Прокрутка включена"
Пожалуйста, посмотрите мою иллюстрацию на fooobar.com/questions/181710/...
Ответ 4
![Mixing Dynamic and Static tableviews in Storeboard]()
suraj k thomas, взгляните на эту структуру моей и отлично поработайте.
@firecast Я не использовал ограничения в этом проекте, однако я установил высоту контейнера на основе высоты таблицы табуляции табло:
ContainerViewController *containerVC = self.childViewControllers.firstObject;
CGRect frame = self.containerView.frame;
frame.origin.x = 0;
frame.origin.y = 0;
frame.size.width = self.tableView.frame.size.width;
frame.size.height = containerVC.tableView.contentSize.height;
self.containerView.frame = frame;
[self.tableView setTableHeaderView:self.containerView];
Надеюсь, что это поможет, дайте мне знать, если у вас есть какие-либо вопросы.
Ответ 5
Добавить новый скрытый UITableView, содержащий ваши динамические ячейки
![enter image description here]()
шаги:
1- В вашем основном UITableViewController
добавьте новый Section
в конце, внутри этого Section
добавьте только один UITableViewCell
, вставьте новый UITableView
внутри ячейки. позвольте нам назвать новую таблицу tblPrototypes
потому что она будет держателем для ячеек Prototype.
2- Теперь задайте тип tblPrototypes
для Dynamic Prototypes, затем добавьте столько прототипов UITableViewCell
сколько вам нужно.
3- Добавить выход для tblPrototypes
в главном контроллере Main Static UITableView
, назовем его tablePrototypes
и, конечно, он имеет тип UITableView
Кодирующая часть:
Сначала обязательно tblPrototypes
из пользовательского интерфейса, так как это последний раздел в главной таблице, вы можете сделать это:
@IBOutlet weak var tblPrototypes: UITableView!
override func numberOfSections(in tableView: UITableView) -> Int {
return super.numberOfSections(in: tableView) - 1
}
Последний раздел не будет представлен.
Теперь, когда вы хотите отображать динамическую ячейку, вы делаете это:
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let needDynamic = true
if !needDynamic {
return super.tableView(tableView, cellForRowAt: indexPath)
}
let cellId = "dynamicCellId1"
let cell = self.tblPrototypes.dequeueReusableCell(withIdentifier: cellId, for: indexPath)
// configure the cell
return cell
}
Ответ 6
Реализуйте ваш tableView как обычно, используя динамические прототипы.Для каждой пользовательской ячейки используйте 1 прототип. Для простого примера мы будем использовать 2 ячейки, AddCell и RoomCell. AddCell идет в первом ряду, а RoomCell во 2-й и любой ячейке ниже.
Не забудьте увеличить свой счет в numberofRowsInSection
на соответствующее количество статических ячеек (в данном случае 1). Поэтому, если вы возвращаете счетчик массива для определения количества строк, для этого примера это будет return array.count + 1
, поскольку у нас есть 1 статическая ячейка.
Я обычно создаю собственный класс для каждой ячейки. Обычно это упрощает настройку ячеек в контроллере представления и является хорошим способом разделения кода, но является необязательным. В приведенном ниже примере используется пользовательский класс для каждой ячейки. Если пользовательский класс не используется, замените оператор if let на оператор if без дополнительного приведения.
примечание: configureCell
ниже - это метод в пользовательском классе RoomCell
, который динамически настраивает ячейку
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
if indexPath.row == 0 {
if let cell = tableView.dequeueReusableCell(withIdentifier: "AddCell", for: indexPath) as? AddCell {
return cell
}
} else {
if let cell = tableView.dequeueReusableCell(withIdentifier: "RoomCell", for: indexPath) as? RoomCell {
cell.configureCell(user: user, room: room)
return cell
}
}
return UITableViewCell() //returns empty cell if something fails
}