有没有一种使用文件管理器重新加载数据的方法?

时间:2019-10-11 22:53:47

标签: swift file-manager

我正在设置一个视图控制器,用户可以在其中选择要显示在前一个视图控制器上的自定义背景图像,而不是默认背景。

  • 用户从其照片库中选择一张照片,该照片使用fileManager保存。
  • 然后在tableViewCell中显示正确的新背景图像

  • 退出视图控制器后。将显示新选择的背景。

我当前遇到的问题是,在关闭视图控制器后,背景不会更改为新的 IF ,用户正在从一个新的背景更改为另一个新的背景。

  • 如果它们从默认背景更改为新背景,则可以很好地更改。如果我从一种新背景更改为另一种背景,然后关闭该应用程序。打开后将显示右边的一个。

  • 此外,如果我使用滑动功能删除存储在filePath中的图像,则关闭后默认背景也会很好显示。

仅从一种新背景到另一种背景时才出现问题。回到第二视图控制器更改背景时,也会发生此问题。单元格再次显示旧的“新背景图像”。即使它确实已根据其原始选择更新为正确的新版本。

我觉得fileManager是在启动时还是在原始创建时(第一次更改背景)加载了数据(图像),即使该数据已被覆盖。在应用关闭并重新启动之前,不会再次加载它。

使用协议重新加载视图控制器以关闭第二个视图控制器时,将调用viewDidLoad函数,以便显示新的背景。

我有一些打印语句,它们显示filePaths和替换了其他旧“新背景图像”的新背景图像以及在viewDidLoad上调用的背景图像filePath完全匹配。

但是仍然显示旧的“新背景图像”。

//Row selected
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    print("Image to change picked in row \(indexPath.row)")
    lastSelectedIndex = indexPath
    self.present(imagePicker, animated: true, completion: nil)
}

// places selected image in image array and reloads table data so image is displaced in cell - also calls save photo
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
    imagePicker.dismiss(animated: true, completion: nil)
    if let photo = info[UIImagePickerController.InfoKey.originalImage] as? UIImage {

        //removeCustomPicture(imagePath: customImagesArray[lastSelectedIndex!.row].filePath, row: lastSelectedIndex!.row)


        customImagesArray[lastSelectedIndex!.row].image = photo
        customImagesArray[lastSelectedIndex!.row].filePath = saveImage(imageName: "\(customImageLabelArray[lastSelectedIndex!.row]).png", row: lastSelectedIndex!.row)
        tableView.reloadData()
    }
    else {
        print("Error retrieving image")
    }
}

//save photo
func saveImage(imageName: String, row: Int) -> String{

    print("save image called")
    let fileManager = FileManager.default
    //get the image path
    let imagePath = (NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as NSString).appendingPathComponent(imageName)

    print("save image function: \(imagePath)")
    //get the image we took from photo library
    let image = customImagesArray[row].image

    //get the PNG data for this image
    let data = image.pngData()

    //store it in the document directory
    fileManager.createFile(atPath: imagePath, contents: data, attributes: nil)
    return imagePath
}


//load image
func getImage(imageName: String, row: Int) -> String {

    let fileManager = FileManager.default
    let imagePath = (NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as NSString).appendingPathComponent("\(imageName).png")
    if fileManager.fileExists(atPath: imagePath){
        customImagesArray[row].image = UIImage(imageLiteralResourceName: imagePath)
        print("get image called")
    } else {
        print("Panic! No Image!")
    }
    return imagePath
}

0 个答案:

没有答案