Пустой контроллер Swift View при попытке загрузить изображение из tableView - PullRequest
0 голосов
/ 05 августа 2020

Потерпи меня, я начинающий программист. Я создаю проект, в котором пользователь входит в свою библиотеку фотографий, выбирает фотографию и отображает имя изображения в tableView. Они могут выбрать это изображение в tableView, и оно затем загрузит это изображение в полном размере.

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

Вот контроллер представления, который отображает изображение:

class DetailViewController: UIViewController {
    
    var selectedImage: String?
    @IBOutlet var image: UIImageView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        if let imageToLoad = selectedImage {
            image.image = UIImage(named: imageToLoad)
        }
    }
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        navigationController?.hidesBarsOnTap = true
    }
    
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillAppear(animated)
    }
    
}

Здесь загружается новое представление:

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    
    if let dvc = storyboard?.instantiateViewController(identifier: "Detail") as? DetailViewController {
        
        dvc.selectedImage = imageArray[indexPath.row].image
        
        navigationController?.pushViewController(dvc, animated: true)
        
    }
    
}

Фотографии выбираются с помощью кнопки navBar и загружаются в imageArray типа Photo здесь:

    @objc func loadImage() {
        
        let picker = UIImagePickerController()
        picker.allowsEditing = 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)
        
        // Convert to JPEG data
        
        if let jpegData = image.jpegData(compressionQuality: 0.8) {
            // We have a valid photo
            try? jpegData.write(to: imagePath)
        }
        
        let photo = Photo(name: "Unkown", image: imageName)
        imageArray.append(photo)
        tableView.reloadData()
        
        dismiss(animated: true)
       
    }
    
    func getDocumentsDirectory() -> URL {
  
        let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
        return paths[0]
    }

И, наконец, вот класс Photo, который содержит данные о фотографии

import UIKit

class Photo: NSObject {
    
    var name: String
    var image: String
    
    init(name: String, image: String) {
        self.name = name
        self.image = image
    }
    
}

Я вижу строку имени изображения, заполняемую в отладчике, когда загружается новый контроллер представления, но по какой-то причине отображается просто белый экран.

Новый контроллер детального представления

@IBOutlet var image: UIImageView!
var url = URL(string: "")

override func viewDidLoad() {
    super.viewDidLoad()

    if let data = try? Data(contentsOf: url!) {
        image.image = UIImage(data: data)            
    }
}
    override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    navigationController?.hidesBarsOnTap = true
}

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

Новый метод didSelectRowAt

    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    
    if let dvc = storyboard?.instantiateViewController(identifier: "Detail") as? DetailViewController {
        

        let imageName = UUID().uuidString
        let urlString = getDocumentsDirectory().appendingPathComponent(imageName)
        dvc.url = urlString
        
        navigationController?.pushViewController(dvc, animated: true)
    }
}

1 Ответ

2 голосов
/ 05 августа 2020

Проблема в этой строке:

image.image = UIImage(named: imageToLoad)

Так вы не найдете изображение. Этот метод просматривается в комплекте приложений. Это не то место, где находится изображение.

Вам нужно получить изображение из того места, где вы его поместили, в каталог «Документы», используя по существу способ, обратный тому, как вы его сохранили. Получите URL-адрес каталога документов, сформируйте URL-адрес файла изображения и загрузите данные изображения с этого URL-адреса с помощью структуры данных, а затем создайте UIImage из данных.

Итак, как только вы рассчитали URL-адрес для этого изображения, точно так, как вы рассчитали, чтобы сохранить его в первую очередь, вы скажете

if let data = try? Data(contentsOf: url) {
     image.image = UIImage(data: data)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...