在 Swift 的 ImagePickerControllerImageURL 的 UserDefaults 中保存并追加一个数组

Save and Append an Array in UserDefaults from ImagePickerControllerImageURL in Swift

我在从 UIImagePickerControllerImageURL 的 UserDefaults 中保存和检索数组时遇到问题。我可以在同步后获取数组,但无法检索它。 myArray 为空。

testImage.image 确实得到了图像,没有问题。

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
    let imageURL: URL = info[UIImagePickerControllerImageURL] as! URL

    //test that imagepicker is actually getting the image
    let imageData: NSData = try! NSData(contentsOf: imageURL)
    let cvImage = UIImage(data:imageData as Data)
    testImage.image = cvImage

    //Save array to UserDefaults and add picked image url to the array
    let usD = UserDefaults.standard
    var array: NSMutableArray = []
    usD.set(array, forKey: "WeatherArray")
    array.add(imageURL)
    usD.synchronize()
    print ("array is \(array)")

    let myArray = usD.stringArray(forKey:"WeatherArray") ?? [String]()
    print ("myArray is \(myArray)")

    picker.dismiss(animated: true, completion: nil)
}

这里有很多问题。

  1. 不要使用NSData,使用Data
  2. 不要使用 NSMutableArray,使用 Swift 数组。
  3. 您可以直接从 info 词典中获取 UIImage
  4. 您无法将 URL 存储在 UserDefaults 中。
  5. 在使用新的 URL 更新数组之前,您将 array 保存到 UserDefaults
  6. 您创建了一个新数组,而不是从 UserDefaults 获取当前数组。
  7. 你不必要地调用 synchronize.
  8. 您不必为大多数变量指定类型。

您的代码已更新以解决所有这些问题:

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
    if let image = info[UIImagePickerControllerOriginalImage] as? UIImage {
        testImage.image = image
    }

    if let imageURL = info[UIImagePickerControllerImageURL] as? URL {
        //Save array to UserDefaults and add picked image url to the array
        let usD = UserDefaults.standard
        var urls = usD.stringArray(forKey: "WeatherArray") ?? []
        urls.append(imageURL.absoluteString)
        usD.set(urls, forKey: "WeatherArray")
    }

    picker.dismiss(animated: true, completion: nil)
}

请注意,这将保存代表每个 URL 的字符串数组。稍后,当您访问这些字符串时,如果您想要 URL,则需要使用 URL(string: arrayElement).