Заполните разные tableViews внутри другой ячейки collectionView - PullRequest
0 голосов
/ 24 мая 2019

У меня сложная ситуация, и мне нужна ваша помощь, чтобы выяснить, что мне делать.

У меня есть один прототип UIcollectionView, этот прототип должен быть создан 4 раза для каждого типа стиля. Я определил эти типы стилей как перечисление:

enum Colors {
    case black, blue, red, green
}

var color = Colors.black

Внутри CollectionViewCell У меня также есть tableView, у которого есть один прототип, содержащий этикетку. И есть четыре массива, которые TableViews должны быть заполнены этими массивами:

var black = ["black1","black2","black3"]
var blue = ["blue1","blue2","blue3"]
var red = ["red1","red2","red3"]
var green = ["green1","green2","green3"]

Теперь я попытался установить соединение между этими TableViews и collectionViews

сначала для UICollectionView

override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
switch indexPath.row {
case 0,1,2,3:
    if let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "colors", for: indexPath) as? colorsCell {

        switch indexPath.row {
        case 1:
            self.color = .black
        case 2:
            self.color = .blue
        case 3:
            self.color = .red
        case 4:
            self.color = .green
        default:
            break
        }

        return cell
    }
default:
    break
}
return UICollectionViewCell()

}

Тогда для TableView

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    switch indexPath.row {
    case 0,1,2,3:
        if let cell = tableView.dequeueReusableCell(withIdentifier: "colCell", for: indexPath) as? colCellDashboard {
            switch self.color {
            case .black:
                cell.title.text = black[indexPath.row]
            case .blue:
                cell.title.text = blue[indexPath.row]
            case .red:
                cell.title.text = red[indexPath.row]
            case .green:
                cell.title.text = green[indexPath.row]
            }
            return cell
        }
    return UITableViewCell()
}

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

Буду признателен, если вы поможете мне в этом.

Ответы [ 2 ]

0 голосов
/ 24 мая 2019

Ааа, проблема с вашим кодом в том, что в вашем cellForItemAt методе делегата представления коллекции вы назначаете цвет для переменной класса self.color. Это будет перезаписываться при каждом вызове делегата. Поэтому, когда вызывается cellForRowAt делегат для tableview, он будет иметь перезаписанное значение self.color (независимо от того, какое значение будет самым обновленным), и в результате вы увидите неожиданную запись в вашей таблице.

Наличие табличных представлений внутри collectionViews является довольно распространенной проблемой. Самый простой подход к решению этой проблемы:

- Поместите ваш источник данных для представления таблицы в collectionViewCell. (Создайте переменную в подклассе UICollectionViewCell.)

-Введите значение в ваш источник данных для каждого табличного представления внутри cellForItemAt делегата CollectionView.

-Запишите все tableViewDelegates внутри collectionViewCell и используйте переменную источника данных CollectionViewCell для заполнения tableView.

Ключ к пониманию того, что tableView находится внутри CollectionViewCell, и, следовательно, ваш CollectionViewCell отвечает за создание tableView.

Структура CollectionViewCell, заданная как @ Sh_Khan , выглядит хорошо (так что не ставьте похожий код).

0 голосов
/ 24 мая 2019

Когда tableView вложен в коллекцию, вы должны использовать

class CollectionCell:UICollectionViewCell,UITableViewDelegate,UITableViewDataSource {

   var tableArr = [String]() // table dataSource array

   func configure(_ res:[String]) {
      tableArr = arr
      self.tableView.reloadData()
   } 

  ///////
  here implement the cellForRowAt and numberOfRows for the nested tableView
}

Внутри vc, который содержит collectionView, объявить массив следующим образом

let arr =  [["black1","black2","black3"] , ["blue1","blue2","blue3"] , 
             ["red1","red2","red3"] ,  ["green1","green2","green3"]]

Тогда внутри cellForItemAt

 if let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "colors", for: indexPath) as? colorsCell {
 cell.configure(arr[indexPath.row])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...