推送 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】:在您的第一个视图控制器中,selectedImage
和 selectedText
在 tableView didSelectRowAt
方法中将为零。 IBOutlet
s 只有在你推送了第二个视图控制器后才会启动。所以在第二个视图控制器中创建一个UIImage
和String
变量并将值发送到这些变量。在第二个视图控制器的viewDidLoad
方法中,将传递的值分配给IBOutlet
s。
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