Не удалось преобразовать значение типа 'String' в ожидаемый тип аргумента 'UIImage'. UIImagePicker помещает в collectionView - хотите просмотреть в подробном VC? - PullRequest
0 голосов
/ 25 августа 2018

Я пытаюсь создать фотоальбом с помощью UIImagePicker в CollectionView и не могу заставить его снова перейти к той же фотографии в подробном UIViewController.Выдернуть мои волосы, и это всего лишь учебник, так как я только начал кодировать!

Может кто-нибудь сказать мне, что я делаю не так?

Вот мой ViewController:

   import UIKit

class ViewController: UIViewController, UINavigationControllerDelegate {
    @IBOutlet private weak var addButton: UIBarButtonItem!
    @IBOutlet private weak var collectionView:UICollectionView!
    @IBOutlet private weak var trashButton:UIBarButtonItem!

    var testItems = [Person]()

    var stormTrooperCollectionArray: [UIImage] = [#imageLiteral(resourceName: "StormTrooper-3052-423a-8c57-7220081e1585_800x"), #imageLiteral(resourceName: "ST3"), #imageLiteral(resourceName: "ST2"), #imageLiteral(resourceName: "ST4")]

    @IBAction func addItem() {
        addNewPerson()
    }

    @IBAction func trashItem(_ sender: Any) {
        if let selectedItems = collectionView.indexPathsForSelectedItems {
            let itemsForDeletion = selectedItems.map{$0.item}.sorted().reversed()
            for item in itemsForDeletion {
                testItems.remove(at: item)
            }
            collectionView.deleteItems(at: selectedItems)
        }
    }

    @objc func refresh() {
        addItem()
        collectionView.refreshControl?.endRefreshing()
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        // Set up a 3-column Collection View
        let width = (view.frame.size.width - 20) / 3
        let layout = collectionView.collectionViewLayout as! UICollectionViewFlowLayout
        layout.itemSize = CGSize(width:width, height:width)
        // Refresh Control
        let refresh = UIRefreshControl()
        refresh.addTarget(self, action: #selector(self.refresh), for: UIControlEvents.valueChanged)
        collectionView.refreshControl = refresh
        // Edit
        navigationItem.leftBarButtonItem = editButtonItem
        navigationController?.isToolbarHidden = true
    }

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

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "DetailSegue" {
            if let dest = segue.destination as? DetailsViewController,
                let index = sender as? IndexPath {
                dest.detailedImageHi = stormTrooperCollectionArray [index.row]
            }
        }
    }

    override func setEditing(_ editing: Bool, animated: Bool) {
        super.setEditing(editing, animated: animated)
        navigationController?.isToolbarHidden = !editing
        addButton.isEnabled = !editing
        trashButton.isEnabled = editing
        collectionView.allowsMultipleSelection = editing
        let indexes = collectionView.indexPathsForVisibleItems
        for index in indexes {
            let cell = collectionView.cellForItem(at: index) as! CollectionViewCell
            cell.isEditing = editing
        }
    }
}

extension ViewController: UICollectionViewDelegate, UICollectionViewDataSource, UIImagePickerControllerDelegate {
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return stormTrooperCollectionArray.count
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CollectionViewCell", for: indexPath) as! CollectionViewCell
        //cell.titleLabel.text = stormTrooperCollectionArray[indexPath.row]

        cell.selectionImage.image = stormTrooperCollectionArray[indexPath.row]
        cell.isEditing = isEditing
        return cell
    }

    @objc func addNewPerson() {
        let picker = UIImagePickerController()
        picker.allowsEditing = true
        picker.delegate = self
        present(picker, animated: true)
    }

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
        guard let image = info[UIImagePickerControllerEditedImage] as? UIImage else { return }

        let imageName = UUID().uuidString
        let imagePicture = getDocumentsDirectory()

        if let jpegData = UIImageJPEGRepresentation(image, 80) {
            try? jpegData.write(to: imagePicture)
        }

        //let detailedItem = Person(imageHi: imageName)
        //testItems.append(detailedItem)

        let detailedItem = Person(imageHi: imageName)
//KEEPS THROWING AN ERROR HERE WHICH SAYS: Cannot convert value of type 'String' to expected argument type 'UIImage'
        stormTrooperCollectionArray.append(detailedItem)
        collectionView?.reloadData()

        dismiss(animated: true)
    }

    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        if !isEditing {
            performSegue(withIdentifier: "DetailSegue", sender: indexPath)
        }
    }

    func getDocumentsDirectory() -> URL {
        let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
        let documentsDirectory = paths[0]
        return documentsDirectory
    }
}

Вот мой ВК для ячейки в CollectionView:

import UIKit

class CollectionViewCell: UICollectionViewCell {
    @IBOutlet weak var titleLabel: UILabel!
    @IBOutlet weak var selectionImage: UIImageView!

}

Вот мой ВК для контроллера детального просмотра:

import UIKit

class DetailsViewController: UIViewController {

    var selection: String!
    var detailedImageHi: UIImage!


    @IBOutlet private weak var detailsLabel: UILabel!
    @IBOutlet private weak var detailedImage: UIImageView!

    override func viewDidLoad() {
        super.viewDidLoad()

        detailsLabel.text = selection
        detailedImage.image = detailedImageHi
    }

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

}

Вот мой ВК для NSObjectФайл Swift:

import UIKit

class Person: NSObject {

    var imageHi: UIImage

    init(imageHi: UIImage){
        self.imageHi = imageHi
    }
}

1 Ответ

0 голосов
/ 25 августа 2018

В вашем коде UIImage image, а не imageName:

guard let image = info[UIImagePickerControllerEditedImage] as? UIImage else { return }

Так что все, что вам нужно сделать, это передать правильный аргумент конструктору Person:

let detailedItem = Person(imageHi: image)

imageName - это случайная строка, сгенерированная с помощью UUID().uuidString и используемая в этом коде для сохранения изображения в каталоге документов со случайным и уникальным именем.

...