2016-12-09 14 views
0

В моем приложении пользователь выбирает изображение из рулона камеры и сохраняется в каталоге документа. Затем изображение отображается на ViewController, где они выбрали изображение. Я хочу, чтобы изображение добавлялось к UICollectionView. Как я могу получить доступ к изображению/добавить изображение из документаDirectory? См. Мой код ниже. Дайте мне знать, если вам нужны другие части моего проекта.Доступ к изображениям в DocumentDirectory iOS и UICollectionView

DetailViewController (Где я сначала отобразить фото):

class DetailViewController: UIViewController, UITextFieldDelegate, UINavigationControllerDelegate, UIImagePickerControllerDelegate { 

... 

var imageStore: ImageStore! 

@IBAction func takePicture(sender: UIBarButtonItem) { 

    let imagePicker = UIImagePickerController() 

    if UIImagePickerController.isSourceTypeAvailable(.Camera) { 
     imagePicker.sourceType = .Camera 
    } else { 
     imagePicker.sourceType = .PhotoLibrary 
    } 
    imagePicker.delegate = self 

    presentViewController(imagePicker, animated: true, completion: nil) 
} 

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String: AnyObject]) { 

    let image = info[UIImagePickerControllerOriginalImage] as! UIImage 

    imageStore.setImage(image, forKey: item.itemKey) 

    imageView.image = image 

    dismissViewControllerAnimated(true, completion: nil) 
} 

override func viewWillAppear(animated: Bool) { 

super.viewWillAppear(animated) 

let key = item.itemKey 

if let imageToDisplay = imageStore.imageForKey(key) { 
    imageView.image = imageToDisplay 
    } 
} 

ImageStore (Как я изначально хранить фото):

import UIKit 

class ImageStore: NSObject { 

let cache = NSCache() 

func setImage(image: UIImage, forKey key: String) { 
    cache.setObject(image, forKey: key) 

    let imageURL = imageURLForKey(key) 

    if let data = UIImageJPEGRepresentation(image, 0.5) { 
     data.writeToURL(imageURL, atomically: true) 
    } 
} 
func imageForKey(key: String) -> UIImage? { 
    if let existingImage = cache.objectForKey(key) as? UIImage { 
     return existingImage 
    } 

    let imageURL = imageURLForKey(key) 
    guard let imageFromDisk = UIImage(contentsOfFile: imageURL.path!) else { 
     return nil 
    } 

    cache.setObject(imageFromDisk, forKey: key) 
    return imageFromDisk 
} 

func deleteImageForKey(key: String) { 
    cache.removeObjectForKey(key) 

    let imageURL = imageURLForKey(key) 
    do { 
     try NSFileManager.defaultManager().removeItemAtURL(imageURL) 
    } 
    catch let deleteError { 
     print("Error removing the image from disk: \(deleteError)") 
    } 
} 

func imageURLForKey(key: String) -> NSURL { 
    let documentsDirectories = 
    NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask) 
    let documentDirectory = documentsDirectories.first! 

    return documentDirectory.URLByAppendingPathComponent(key) 
    } 

} 

UICollectionView:

import UIKit 

class PhotosViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource { 

var collectionView: UICollectionView! 

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 
    let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout() 
    layout.sectionInset = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10) 
    layout.itemSize = CGSize(width: 300, height: 490) 

    collectionView = UICollectionView(frame: self.view.frame, collectionViewLayout: layout) 
    collectionView.dataSource = self 
    collectionView.delegate = self 
    collectionView!.registerClass(FoodCell.self, forCellWithReuseIdentifier: "Cell") 
    collectionView.backgroundColor = UIColor.whiteColor() 
    self.view.addSubview(collectionView) 
} 

override func viewWillAppear(animated: Bool) { 
    super.viewWillAppear(animated) 
} 

func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 
    return images.count 
} 

var images: [UIImage] = [ 

] 

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier("Cell", forIndexPath: indexPath) as! FoodCell 
    cell.textLabel.text = "" 
    cell.imageView.image = images[indexPath.row] 
    return cell 
} 

func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) 
{ 
    print("User tapped on item \(indexPath.row)") 
} 


override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
    } 
} 

ответ

0

Вы можете попробовать для сохранения и получения изображения таким образом:

//Save image 
let img = UIImage() // Image from your picker 
let data = UIImagePNGRepresentation(img)! 
do { 
    let documentsPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as String 
    try data.writeToFile("\(documentsPath)myImage", options: []) 

} catch { 
    print("Error") 
} 

// Get image 
do { 
    let documentsPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as String 
    let readData = try NSData(contentsOfFile: "\(documentsPath)myImage", options: []) 
    let retreivedImage = UIImage(data: readData) 
} 
catch { 
    print("Error") 
} 

Точно так же, как https://stackoverflow.com/a/35685943/2894160

+0

Я попробовал это, но это не правильно сохранить изображение. После того как я отклонил DetailViewController, а затем вернулся к нему, изображение больше не отображается. – Allie

 Смежные вопросы

  • Нет связанных вопросов^_^