Это та же проблема, что и в этом посте SO: Как переименовать файлы в каталоге документов , но это мне совсем не помогло. Это единственный пост, с которым я столкнулся, который связан с моей проблемой.
У меня есть представление коллекции, где изображения добавляются через imagePickerController в didFinishPickingMediaWithInfo. Он проходит по каталогу документов и дает выбранному изображению имя в соответствии со следующим доступным индексным номером. Таким образом, изображения получают имя image1.jpg, image2.jpg и т. Д. Когда изображения загружаются в collectionView, я снова перебираю и показываю изображения в порядке индекса. Когда пришло время удалить изображение, я могу найти его в каталоге документов и удалить его, но затем порядок индексов прерывается, и я больше не могу загружать изображения. Таким образом, если я удаляю image3.png, каталог документов содержит image1.jpg, image2.jpg, image4.jpg, image5.jpg и т. Д.
Мой текущий код, который пытается переименовать или переместить изображения в каталоге, по-прежнему зацикливается на индексных числах и естественно останавливается, когда дело доходит до пустого индекса (image3.jpg). Как я могу заставить image4.jpg переместиться туда, где раньше находился image3.jpg (и переместить все другие изображения, которые следуют по индексу, где изображение было удалено)?
Я не могу полностью обдумать логику, необходимую для переименования файлов. Дайте мне знать, если вам нужно больше кода. Все предложения приветствуются.
Вот что у меня сейчас:
@objc func tapToDelete(recognizer: UITapGestureRecognizer)
{
let pointInCollectionView = recognizer.location(in: collectionView)
let indexPath = collectionView.indexPathForItem(at: pointInCollectionView)
countIndex = (indexPath?.row)! + 1
let filepath = getFolderAndFilePath() //this gets the folder and filepath of each image
let alert = UIAlertController(title: "Delete This Image?", message: "Are you sure? This cannot be undone.", preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil))
alert.addAction(UIAlertAction(title: "Delete", style: .destructive, handler: { (action) in
do
{
try self.fileManager.removeItem(at: filepath as URL)
self.imageArray.remove(at: self.countIndex)
self.folderPath = self.getFolderPath()
if self.folderPath != nil
{
var j = 0
var z = 0
var finalArray = [String]()
do
{
let directoryContent = try FileManager.default.contentsOfDirectory(at: self.folderPath! as URL, includingPropertiesForKeys: nil, options: [])
for _ in directoryContent
{
z += 1
let fileString = String(format: "image%d.jpg", z)
let oldPath = self.folderPath?.appendingPathComponent(fileString)
print("filename oldPath ?: \(String(describing: oldPath))")
if self.fileManager.fileExists(atPath: (oldPath?.path)!)
{
j += 1
let newFileName = String(format: "image%d.jpg", j)
finalArray.append(newFileName)
let newPath = oldPath?.deletingLastPathComponent().appendingPathComponent(newFileName)
print("new filename: \(String(describing: newFileName))")
_ = try? self.fileManager.moveItem(atPath: (oldPath?.path)!, toPath: (newPath?.path)!)
}
else
{
print("no file here")
//this is called when we get to the image removed(image3.jpg)
}
self.collectionView.reloadData() //this reloads the collectionview and updates the count but still shows image3 instead of image4 even though image3 has been removed from the directory
}
}
catch
{
print("Could not search for urls of files in documents directory: \(error)")
}
}
}
catch
{
print(error)
}
}))
self.present(alert, animated: true)
}