我的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连接,添加了已识别的重用,但是什么也没发生
答案 0 :(得分:0)
您需要设置
override func awakeFromNib() {
super.awakeFromNib()
self.collectionViewRef.dataSource = self
self.collectionViewRef.delegate = self
}
class JournalSceneCell: UITableViewCell, UICollectionViewDataSource,UICollectionViewDelegate {
答案 1 :(得分:0)
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 不为零