无法从UITableViewCell加载UICollectionView

时间:2019-02-27 13:21:37

标签: ios swift uitableview uicollectionview

我的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根本不从UICollectionViewDataSource调用collectionView函数。一切都通过IB连接,添加了已识别的重用,但是什么也没发生

5 个答案:

答案 0 :(得分:0)

您需要设置

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

class JournalSceneCell: UITableViewCell, UICollectionViewDataSource,UICollectionViewDelegate {

答案 1 :(得分:0)

在tableView单元格中重新加载集合视图,它将起作用

cell.collectionViewRef.reloadData()

答案 2 :(得分:0)

convenience init()没有被调用。 最后,我通过向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
}

答案 3 :(得分:0)

我遇到了类似的问题,这是因为UICollectionView甚至没有被绘制在UITableViewCell中,所以我不得不在集合视图中设置最小高度NSLayoutConstraint

在这种情况下,您可能需要UICollectionView的高度才能动态变化,但是我不确定这的最佳选择。

答案 4 :(得分:-1)

一次交叉检查 selectedImages 不为零