推送 ViewController 时无法传输图像

Posted

技术标签:

【中文标题】推送 ViewController 时无法传输图像【英文标题】:Can't transfer image while pushing ViewController 【发布时间】:2019-06-05 06:18:11 【问题描述】:

我有tableView,其中有imageView和label,当我选择单元格时,我想推送另一个viewController并在其中显示我选择的单元格imageView.image和label.text,但是出现错误(意外发现nil而在图像行中隐式展开可选值)

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
    let vc = storyboard?.instantiateViewController(withIdentifier: "PushedViewController") as? PushedViewController
    vc?.pushedImage.image = UIImage(named: imagesArray[indexPath.row])
    vc?.pushedLabel.text = imagesArray[indexPath.row]
    self.navigationController?.pushViewController(vc!, animated: true)

在隐式展开可选值时意外发现 nil

【问题讨论】:

在哪一行出现错误? 【参考方案1】:

你发的不多,但似乎崩溃的行是

self.navigationController?.pushViewController(vc!, animated: true)

你确定这个storyboard?.instantiateViewController(withIdentifier: "PushedViewController") as? PushedViewController 不是nil

也许PushedViewController 不在同一个故事板中。无论如何,只需将其放入 guard let 即可打开可选

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
    guard let vc = storyboard?.instantiateViewController(withIdentifier: "PushedViewController") as? PushedViewController else  //fallback goes here return 
    vc.pushedImage.image = UIImage(named: imagesArray[indexPath.row])
    vc.pushedLabel.text = imagesArray[indexPath.row]
    self.navigationController?.pushViewController(vc, animated: true)

【讨论】:

【参考方案2】:

在您的第一个视图控制器中,selectedImageselectedTexttableView didSelectRowAt 方法中将为零。 IBOutlets 只有在你推送了第二个视图控制器后才会启动。所以在第二个视图控制器中创建一个UIImageString 变量并将值发送到这些变量。在第二个视图控制器的viewDidLoad 方法中,将传递的值分配给IBOutlets。

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
    let vc = storyboard?.instantiateViewController(withIdentifier: "PushedViewController") as? PushedViewController
    //vc?.pushedImage vc?.pushedLabel are nil
    vc?.selectedImage = UIImage(named: imagesArray[indexPath.row])
    vc?.selectedText = imagesArray[indexPath.row]
    self.navigationController?.pushViewController(vc!, animated: true)

PushedViewController

class PushedViewController: UIViewController 
    @IBOutlet weak var pushedLabel: UILabel!
    @IBOutlet weak var pushedImage: UIImageView!
    var selectedImage: UIImage?
    var selectedText: String?
    override func viewDidLoad() 
        super.viewDidLoad()
        //vc?.pushedImage vc?.pushedLabel are not nil
        pushedImage.image = selectedImage
        pushedLabel.text = selectedText
    

【讨论】:

【参考方案3】:

UI 组件尚未初始化,因此您无法在初始化控制器后立即访问它们。

我建议你在PushedViewController 中有一个局部变量来存储图像和文本,然后在viewDidLoad 中分配它们。

像这样:

class PushedViewController: UIViewController 
    //..
    var image:UIImage?
    var text:String?
    //..
    override viewDidLoad() 
        super.viewDidLoad()
        //..
        if let image = self.image 
            self.imageView.image = image
        
        if let text = self.text 
            self.label.text = text
        
        //..
    
    //..

然后从您推送控制器的位置设置这些属性:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
    guard let vc = storyboard?.instantiateViewController(withIdentifier: "PushedViewController") as? PushedViewController else  return 
    // Assign the properties here
    vc.image = UIImage(named: imagesArray[indexPath.row])
    vc.text = textsArray[indexPath.row]
    self.navigationController?.pushViewController(vc, animated: true)

【讨论】:

以上是关于推送 ViewController 时无法传输图像的主要内容,如果未能解决你的问题,请参考以下文章

从 UIImagePickerController 相机视图推送一个 viewController

推送 ViewController 时清除 navigationController 堆栈

在 iOS 10 下使用 FCM 在前台单击推送通知后无法导航到特定的 viewController

NavigationController 推送扭曲背景图像

将从 AppDelegate 的推送通知中收到的数据传递给 ViewController

无法推送 viewController,因为 navigationController 为 nil