获取使用情节提要创建的视图控制器的属性

Posted

技术标签:

【中文标题】获取使用情节提要创建的视图控制器的属性【英文标题】:Get attribute of viewcontroller created with storyboard 【发布时间】:2017-06-08 21:31:22 【问题描述】:

我目前正在学习 swift,我正在尝试从情节提要作品中学习实例化,但我现在面临的错误没有太多记录。

我在主情节提要中创建了一个视图控制器,并将其类型指定为我之前调用的自定义类SimpleNewsViewController,这是我的类的代码,它不是复杂:

class SimpleNewsViewController: UIViewController 

@IBOutlet weak var myImage: UIImageView!
@IBOutlet weak var myLabel: UILabel!
@IBOutlet weak var myText: UITextView!

var event: Events!

override func viewDidLoad() 
    super.viewDidLoad()

在我的主故事板上,这里是我指定的自定义 ViewController: My Storyboard implementation

现在问题来了:在我的代码中,我通过 instanciateViewController(identifier: "NewsView") 实例化了我的 ViewController,然后我尝试像在这段代码中一样设置我的 3 个属性:

...
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let controller = storyboard.instantiateViewController(withIdentifier: "NewsView") as! SimpleNewsViewController
    //controller.myImage.image = UIImage(named: "image.jpg")
    //controller.myText.text = "this is an example that can be really long"
    //controller.myTitle.text = "this is a title example
    self.navigationController?.pushViewController(controller, animated: true)
...

如果我取消注释这三行,我会收到一条错误消息:

致命错误:在展开可选值时意外发现 nil

IDE 还会显示错误代码和线程(如果有帮助的话): The error

【问题讨论】:

【参考方案1】:

在实例化控制器后,出口尚未连接,您必须声明临时变量并在viewDidLoad()中设置出口属性

...
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let controller = storyboard.instantiateViewController(withIdentifier: "NewsView") as! SimpleNewsViewController
    controller.tempImage = UIImage(named: "image.jpg")
    controller.tempLabel = "this is an example that can be really long"
    controller.tempText = "this is a title example
    self.navigationController?.pushViewController(controller, animated: true)
...

class SimpleNewsViewController: UIViewController 

@IBOutlet weak var myImage: UIImageView!
@IBOutlet weak var myLabel: UILabel!
@IBOutlet weak var myText: UITextView!

var tempImage : UIImage?
var tempLabel = ""
var tempText = ""

var event: Events!

override func viewDidLoad() 
    super.viewDidLoad()
    myImage.image = tempImage
    myLabel.text = tempLabel
    tempText.text = tempText

【讨论】:

以上是关于获取使用情节提要创建的视图控制器的属性的主要内容,如果未能解决你的问题,请参考以下文章

台风从情节提要将属性注入视图控制器

在情节提要中使用 segues 使视图控制器具有非可选属性?

如何以编程方式快速使用情节提要 ID 获取当前视图控制器(当前正在呈现)?

如何获取使用情节提要创建的按钮的对象

如何在不使用情节提要的情况下获取视图控制器的 NibName

您可以使用为带有情节提要的 xib 创建的视图控制器吗?