这是此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 ...
非常感谢任何帮助!
答案 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()
}