从文档目录中的数组填充集合视图

Populating Collection View from Array in Document Directory

这是 question 的后续。非常感谢@rmaddy 和@LeoDabus 迄今为止的帮助!

好的:我的 addImage 按钮在我第一次选择图像时在 collectionView 中为我提供了正确的图像。

不好:我第二次select一张图片,它把两个单元格都变成了第二张图片。到 third/fourth/etc 次我尝试添加图像时,无论我选择什么图像,图像在每个单元格中始终相同(即第一次尝试:图像 1,第二次尝试:图像 2,图像 2,第三次尝试:图像 2,图片 2,图片 2)。

我的问题:如何使所选图像正确填充增量单元格?

这是我的代码:

从count中获取collectionView中cell的个数

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {

    let fileManager = FileManager.default
    let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as String
    let dirContents = try? fileManager.contentsOfDirectory(atPath: documentsPath)
    let count = dirContents?.count
    return count!
        }

填充视图

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! myCell
    let fileManager = FileManager.default
    let documentDirectory = fileManager.urls(for: .documentDirectory, in: .userDomainMask)[0]
    let directoryContents = try! fileManager.contentsOfDirectory(at: documentDirectory, includingPropertiesForKeys: nil)

    for imageURL in directoryContents where imageURL.pathExtension == "jpeg" {
        if let image = UIImage(contentsOfFile: imageURL.path) {
            cell.myImageView.image = image //[indexPath.row] **need "image" to be an array so can assign to indexPath.row
        } else {
            fatalError("Can't create image from file \(imageURL)")
        }
    }
    return cell
}

addMyImage 按钮打开 imagePicker

@IBAction func addMyImage(_ sender: UIButton) {

//imagePickerController stuff
}

在文件管理器

中保存图像URL
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {

if let imageURL = info[UIImagePickerControllerImageURL] as? URL {

    let documentDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
    do {
        try FileManager.default.moveItem(at: imageURL.standardizedFileURL, to: documentDirectory.appendingPathComponent(imageURL.lastPathComponent))
        collectionView.reloadData()
    } catch {
        print(error)
    }
}

经过大量谷歌搜索后,我认为问题是我没有将 [indexPath.row] 分配给我的 cellForItemAt IndexPath 中的数组,因此当 documentDirectory 使用 URL 更新时,每个新单元格未指向正确的 URL。不幸的是,我在那个函数

中调用了一个特定的 URL
for imageURL in directoryContents where imageURL.pathExtension == "jpeg" 

所以我不确定如何分配 indexPath.row...

非常感谢任何帮助!

您正在迭代 directoryContents

for imageURL in directoryContents where imageURL.pathExtension == "jpeg" {
    if let image = UIImage(contentsOfFile: imageURL.path) {
        cell.myImageView.image = image //[indexPath.row] **need "image" to be an array so can assign to indexPath.row
    } else {
        fatalError("Can't create image from file \(imageURL)")
    }
}

这就是为什么您只获得所有单元格上的最后一张图像的原因。

你应该做的是获取目录内容并将其存储在数组变量中(例如 directoryContentsArray = self.fetchDirectoryContents())

制作一个类似于此的函数,并在 viewDidLoad 上调用它: 这将填充您的数组。

func fetchDirectoryContents() {
    let fileManager = FileManager.default
    let documentDirectory = fileManager.urls(for: .documentDirectory, in: .userDomainMask)[0]
    let directoryContents = try! fileManager.contentsOfDirectory(at: documentDirectory, includingPropertiesForKeys: nil)

    self.directoryContentsArray = directoryContents
    self.tableView.reloadData() 
}

然后将数组计数用于 numberOfRows 和数据源。 您当前的设计现在实际上很糟糕,因为您总是在所有 tableView 方法中调用 FileManager

现在,成功添加图像并保存后,您将重新填充数组(或者您实际上可以将其附加到现有数组)

编辑:所以在您的 cellForItem

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

    if let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as? myCell {
       let imageFile = self.directoryContentsArray[indexPath.item]
       if let imageURL = imageFile.path, 
          imageFile.pathExtension == "jpeg",
          let image = UIImage(contentsOfFile: imageURL) {
          cell.imageView.image = image
       } else {
          fatalError("Can't create image from file \(imageFile)")
       }
    return cell
    }
return UICollectionViewCell()
}