【发布时间】:2020-08-05 01:03:09
【问题描述】:
请耐心等待,因为我是新手程序员。我正在构建一个项目,用户进入他们的照片库,选择一张照片并在 tableView 中显示图像的名称。他们可以在 tableView 中选择该图像,然后它将加载该图像的完整尺寸。
问题:当我点击tableView中的row item加载图片时,新的view controller只是一个白屏,而不是之前选中的图片。
这是显示图像的视图控制器:
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)
}
}
使用导航栏按钮项选择照片并在此处加载到 Photo 类型的 imageArray 中:
@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)
}
}
【问题讨论】:
-
不要在
viewWillDisappear中调用super.viewWillAppear。 -
感谢您的快速回复。但是,从 tableView 中选择项目时仍然出现空白屏幕。我想知道 imageName 是否设置不正确,因此当它尝试将其分配给我的另一个视图控制器上的图像视图时不存在。我确实在我的 imageArray 中看到了一个图像名称。想法?
-
是的,我看到了问题所在。我会写一个答案。顺便问得很好。