Подтвердить что ты не робот

UITableView Mix из статических и динамических ячеек?

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

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

Fixed
Fixed
Fixed
Dynamic
Dynamic
Dynamic
Dynamic
Dynamic
Fixed
Fixed

Итак, как именно вы порекомендовали мне подход к этому в моем методе cellForRowAtIndexPath?

Спасибо.

4b9b3361

Ответ 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

для случая вопроса:

  1. Установить разделы таблицыView в 3

enter image description here

  1. Добавьте пустую ячейку tableview во второй раздел, который вы хотите применить к динамическим ячейкам, измените идентификатор ячейки как WiFiTableViewCell

  2. создать новый XIB файл с именем WiFiTableViewCell

enter image description here

  1. зарегистрируйте Nib в функции ViewDidLoad в tableViewController

    tableView.register(UINib(nibName: "WiFiTableViewCell", bundle: nil), forCellReuseIdentifier: "WiFiTableViewCell")
    
  2. добавьте следующий код для использования как динамической, так и статической ячейки

    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

  1. Реализуйте ваш tableView как обычно, используя динамические прототипы.Для каждой пользовательской ячейки используйте 1 прототип. Для простого примера мы будем использовать 2 ячейки, AddCell и RoomCell. AddCell идет в первом ряду, а RoomCell во 2-й и любой ячейке ниже.

  2. Не забудьте увеличить свой счет в numberofRowsInSection на соответствующее количество статических ячеек (в данном случае 1). Поэтому, если вы возвращаете счетчик массива для определения количества строк, для этого примера это будет return array.count + 1, поскольку у нас есть 1 статическая ячейка.

  3. Я обычно создаю собственный класс для каждой ячейки. Обычно это упрощает настройку ячеек в контроллере представления и является хорошим способом разделения кода, но является необязательным. В приведенном ниже примере используется пользовательский класс для каждой ячейки. Если пользовательский класс не используется, замените оператор 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
}