UIImagePickerController не выбирает изображение - PullRequest
0 голосов
/ 11 июня 2019

Я пытаюсь создать приложение TableView, которое позволяет добавлять изображения и имена к нему с помощью ImagePickerController и изменять его имя с помощью AlertController TextField

Проблема в том, что ImagePicker не берет изображение, и на консоли отладки не отображается ошибка.

Когда я нажимаю на изображение, чтобы выбрать его, ничего не происходит.

class ViewController: UITableViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {

    var photos = [Photo]()

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        title = "Snapshots"
        navigationController?.navigationBar.prefersLargeTitles = true

        navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(addPhoto))

        let defaults = UserDefaults.standard

        if let savedPhotos = defaults.object(forKey: "photos") as? Data {
            let jsonDecoder = JSONDecoder()
            do {
                photos = try jsonDecoder.decode([Photo].self, from: savedPhotos)
            } catch {
                print("Failed to load photos.")
            }
        }

    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return photos.count
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        guard let cell = tableView.dequeueReusableCell(withIdentifier: "Photo", for: indexPath) as? PhotoCell else {
            fatalError("Could not load the Photo Cell")
        }
        let photo = photos[indexPath.row]
        cell.textLabel?.text = photo.name
        let path = getDocumentsDirectory().appendingPathComponent(photo.image)
        cell.imageView?.image = UIImage(contentsOfFile: path.path)

        return cell
    }

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

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

        let imageName = UUID().uuidString
        let imagePath = getDocumentsDirectory().appendingPathComponent(imageName)

        if let jpegData = image.jpegData(compressionQuality: 0.8) {
            try? jpegData.write(to: imagePath)
        }

        let photo = Photo(name: "New Image", image: imageName)
        photos.append(photo)
        save()
        tableView.reloadData()

        dismiss(animated: true)

    }

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

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

            let photo = photos[indexPath.row]

            let ac = UIAlertController(title: "What you want to do with Image?", message: nil, preferredStyle: .alert)

            ac.addTextField()

            ac.addAction(UIAlertAction(title: "Rename", style: .default) {
                [weak self, weak ac] _ in
                guard let newName = ac?.textFields?[0].text else { return }
                photo.name = newName
                self?.save()
                self?.tableView.reloadData()
            })

            ac.addAction(UIAlertAction(title: "Delete", style: .destructive) {
                [weak self] _ in
                self?.photos.remove(at: indexPath.row)
                self?.tableView.reloadData()
            })

            ac.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil))

            ac.addAction(UIAlertAction(title: "Open", style: .default) {
                [weak self] _ in
                if let vc = self?.storyboard?.instantiateViewController(withIdentifier: "PhotoView") as? DetailViewController {
                    vc.selectedImage = photo.name
                    self?.navigationController?.pushViewController(vc, animated: true)
                }
            })

            present(ac, animated: true)

    }

    func save() {
        let jsonEncoder = JSONEncoder()
        if let savedData = try? jsonEncoder.encode(photos) {
            let defaults = UserDefaults.standard
            defaults.set(savedData, forKey: "photos")
        } else {
            print("Failed to save photos.")
        }
    }

}

Ответы [ 2 ]

0 голосов
/ 12 июня 2019

Я на самом деле взял ваш код и сжал его немного, чтобы протестировать локально, и обнаружил здесь одну возможную проблему:

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

Если ваш пользователь не редактировал фотографию, то возвращается результат и ничегопроисходит далее.

Однако, если я изменю его на .originalImage, как это, то простой выбор изображения позволит ему продолжить:

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

С учетом сказанного, вы можете захотетьрассмотрите оператор switch или некоторые if / else для упрощения различных типов изображений на основе того, что подходит вашему приложению.

0 голосов
/ 11 июня 2019

Вы добавили разрешение на использование библиотеки фотографий в файле info.plist? Если вы этого не сделали, добавьте «Конфиденциальность - описание использования библиотеки фотографий» в info.plist.

...