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, добавлено идентифицированное повторное использование, но ничего не произошло