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

时间:2018-01-09 08:29:07

标签: swift uicollectionview nsfilemanager

这是此question的后续内容。非常感谢@rmaddy和@LeoDabus给你的帮助!

:我第一次选择图片时,我的addImage按钮会在collectionView中获取正确的图像。

错误:第二次选择图片时,它会将两个单元格更改为第二个图像。到第三次/第四次/等次,我尝试添加图像,无论我选择什么图像,每个单元格的图像总是相同的(即第一次尝试:image1,第二次尝试:图像2,图像2,第三次尝试:图像2,图像2,图像2)。

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

这是我的代码:

从count

获取collectionView中的单元格数
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
}

将imageURL保存在文件管理器中

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 ...

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:3)

您正在迭代 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()
}