Не удается загрузить UICollectionView из UITableViewCell - PullRequest
0 голосов
/ 27 февраля 2019

My UITableViewController имеет ячейки со встроенным UICollectionView.Я хочу переместить UIViceController логику в класс ячейки - JournalSceneCell.Чтобы реализовать это в контроллере, я присвоил переменной ячейки imagesFilename новое значение

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    guard let cell = ... as? JournalSceneCell
    cell.imagesFilename = Array(journalRef!.entries[indexPath.row].imagesFilenames)
    return cell
}

Изображения могут быть большими, и чтобы сделать загрузку UITableViewController максимально быстрой, я попытался выполнить загрузку изображений враздел didSet, а также использовать фоновый поток:

class JournalSceneCell: UITableViewCell, UICollectionViewDataSource {

    @IBOutlet weak var entryTitle: UILabel!
    @IBOutlet weak var locationText: UILabel!
    @IBOutlet weak var desctiptionText: UILabel!
    @IBOutlet weak var editButton: UIButton!
    @IBOutlet weak var shareButton: UIButton!
    @IBOutlet var collectionViewRef: UICollectionView!

    convenience init() {
        self.init()
        self.collectionViewRef.dataSource = self
   }

    struct ImageEntry {
        var image:UIImage
        var imageURL:URL
    }

    let collectionCellID = "JournalCollectionCellID"

    var selectedImages = [ImageEntry]()

    var imagesFilename = [String]() {
        didSet {
            DispatchQueue.global(qos: .background).async {
                let documentURL = try! FileManager.default.url(for: .documentDirectory,
                                                               in: .userDomainMask,
                                                               appropriateFor: nil,
                                                               create: true)
                self.selectedImages.removeAll()
                for imageName in self.imagesFilename {
                    let imageURL = documentURL.appendingPathComponent(imageName)
                    let imageData = try! Data(contentsOf: imageURL)
                    let img = UIImage(data: imageData)!
                    self.selectedImages.append(ImageEntry(image: img, imageURL: imageURL))
                }
                DispatchQueue.main.async {
                    self.collectionViewRef.reloadData()
                }
            }
        }
    }

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return selectedImages.count
    }


    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        guard let cell = collectionViewRef.dequeueReusableCell(withReuseIdentifier: collectionCellID,
                                                        for: indexPath) as? JournalCollectionCell else {
            fatalError("Cannot connect a collection cell")
        }

        cell.imageView.image = selectedImages[indexPath.row].image
        return cell

    }

}

Проблема: JournalSceneCell вообще не вызывает collectionView func из UICollectionViewDataSource.Все подключено через IB, добавлено идентифицированное повторное использование, но ничего не произошло

Ответы [ 5 ]

0 голосов
/ 28 февраля 2019

У меня была похожая проблема, и это было потому, что UICollectionView даже не рисовался в UITableViewCell, поэтому мне пришлось установить минимальную высоту NSLayoutConstraint в представлении коллекции.

В этом случае вам, вероятно, нужно, чтобы высота UICollectionView была динамичной, но я не совсем уверен, что ваш лучший маршрут для этого.

0 голосов
/ 27 февраля 2019

convenience init() не вызывается.Наконец, я решил проблему, добавив func loadImages(fileNameArray:[String]) в JournalSceneCell:

func loadImages(fileNameArray:[String]) {
    self.imageSetView.dataSource = self
    DispatchQueue.global(qos: .background).async {
        let documentURL = try! FileManager.default.url(for: .documentDirectory,
                                                       in: .userDomainMask,
                                                       appropriateFor: nil,
                                                       create: true)
        self.selectedImages.removeAll()
        for imageName in fileNameArray {
            let imageURL = documentURL.appendingPathComponent(imageName)
            let imageData = try! Data(contentsOf: imageURL)
            let img = UIImage(data: imageData)!
            self.selectedImages.append(ImageEntry(image: img, imageURL: imageURL))
        }

        DispatchQueue.main.async {
            self.imageSetView.reloadData()
        }

    }
}

Позже я просто назвал его из tableView(_:cellForRowAt:)

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    guard let cell = .. as? JournalSceneCell,
    cell.loadImages(fileNameArray:Array({...}))
    return cell
}
0 голосов
/ 27 февраля 2019

Перекрестная проверка один раз selectedImages не ноль

0 голосов
/ 27 февраля 2019

Обновить представление коллекции в ячейке tableView, она будет работать

cell.collectionViewRef.reloadData ()

0 голосов
/ 27 февраля 2019

Вам нужно установить

override func awakeFromNib() {
   super.awakeFromNib()
   self.collectionViewRef.dataSource = self
   self.collectionViewRef.delegate = self
}

class JournalSceneCell: UITableViewCell, UICollectionViewDataSource,UICollectionViewDelegate {
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...