如何在视图控制器上保存和调用 UIImage?
Posted
技术标签:
【中文标题】如何在视图控制器上保存和调用 UIImage?【英文标题】:How do i save and recall a UIImage on the View Controller? 【发布时间】:2016-10-25 10:19:01 【问题描述】:我正在使用 Swift 3 并一直关注苹果 https://developer.apple.com/library/content/referencelibrary/GettingStarted/DevelopiosAppsSwift/Lesson4.html 在 20 个不同的 UIViewcontroller
上创建了 20 个不同的 UIImage 视图
它们被称为photoImageView1
photoImageView2
等。目前您可以点击每个通用图像并输入您自己的图像。
我希望用户能够输入他们的图像并保存它,当他们重新打开相同的viewcontroller
时,他们输入的图像就在那里。
我查看了许多不同的方法,但是我尝试关注这个问题Save images in NSUserDefaults? 并再次失败。任何帮助将不胜感激,谢谢。
【问题讨论】:
当您“输入”您拥有的图像时,您必须使用 UIImagePickerController。因此,将您选择的图像保存在 DocumentDirectory 中(确保您唯一地命名它们)并将路径存储在 ARRAY / .PLIST / 或 MODEL 中。 【参考方案1】:我最终使用了这种方法,它可能不是最好的,但它很简单而且很有效。
import UIKit
class timetable: UIViewController, UINavigationControllerDelegate, UIImagePickerControllerDelegate
@IBOutlet var imageviewtimetable: UIImageView!
@IBAction func saveMyImage(_ sender: UIBarButtonItem)
let myTimeTableImage = imageviewtimetable.image
let theImageData:NSData = UIImagePNGRepresentation(myTimeTableImage!)! as NSData
UserDefaults.standard.set(theImageData, forKey: "mySavedImage")
let data = UserDefaults.standard.object(forKey: "mySavedImage")
imageviewtimetable.image = UIImage(data: data as! Data)
override func viewDidLoad()
super.viewDidLoad()
// Do any additional setup after loading the view.
let data = UserDefaults.standard.object(forKey: "mySavedImage")
imageviewtimetable.image = UIImage(data: data as! Data)
override func didReceiveMemoryWarning()
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
@IBAction func selectImageFromPhotoLibrary(_ sender: Any)
let imagePickerController = UIImagePickerController()
imagePickerController.sourceType = .photoLibrary
imagePickerController.delegate = self
present(imagePickerController, animated: true, completion: nil)
func imagePickerControllerDidCancel(_ picker: UIImagePickerController)
dismiss(animated: true, completion:nil)
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject])
let selectedImage = info[UIImagePickerControllerOriginalImage] as! UIImage
imageviewtimetable.image = selectedImage
dismiss(animated: true,completion:nil)
/*
// MARK: - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepare(for segue: UIStoryboardSegue, sender: Any?)
// Get the new view controller using segue.destinationViewController.
// Pass the selected object to the new view controller.
*/
【讨论】:
【参考方案2】:您可以将图像名称存储在数据库、iCloud、plist 甚至 Userdefaults 中。要将图像保存到磁盘而不是照片库,请使用:
import PlaygroundSupport
import UIKit
func save(image: UIImage, name: String) -> Bool
guard var path = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first,
let imageData = UIImagePNGRepresentation(image) else
return false
path = path.appendingPathComponent(name)
do
try imageData.write(to: path)
catch
return false
return true
func loadImage(name: String) -> UIImage?
guard var path = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else
return nil
path = path.appendingPathComponent(name)
return UIImage(contentsOfFile: path.relativePath)
let image = UIImage(named: "test.png")!
save(image: image, name: "test2.png")
let loadedImage = loadImage(name: "test2.png")
PlaygroundPage.current.liveView = UIImageView(image: loadedImage)
编辑:我将源代码更改为完整的 Playground,以便您可以将其复制并粘贴到 Playground 中并运行它。您唯一需要做的就是将名为 test.png 的文件拖到 Resources 文件夹中。
【讨论】:
我是不是要改变 (let imageData = UIImagePNGRepresentation(image) else ) 图像部分?如果是的话怎么办?当我使用函数时,它会出现错误缺少参数,当我将其更改为我想象的其他内容时,我会收到错误无法在 UIImage 类型上使用 UIImageView 类型。 我想我必须用一个名字来清除它,不是吗?然后把那个名字放在那里。图像在哪里......然后在(名称)下输入名称以将其保存在文件目录下 name 是文件名。它保存在文档目录中。您可以在documents 目录下创建自己的目录,但本示例并没有这样做。代码按原样工作;我在操场上测试了它。如果您不介意有损压缩,可以将 UIImagePNGRepresentation 更改为 UIImageJPGRepresentation。 目前工作,稍后尝试将其添加到程序中,谢谢以上是关于如何在视图控制器上保存和调用 UIImage?的主要内容,如果未能解决你的问题,请参考以下文章
使用推送视图控制器时如何将 Uiimage 从一个视图控制器传递到另一个视图控制器?