从文档目录中的数组填充集合视图
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()
}
这是 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
}
在文件管理器
中保存图像URLfunc 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。不幸的是,我在那个函数
中调用了一个特定的 URLfor 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()
}