Потерпи меня, я начинающий программист. Я создаю проект, в котором пользователь входит в свою библиотеку фотографий, выбирает фотографию и отображает имя изображения в 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)
}
}