Dav*_*vid 7 xcode uiviewcontroller viewdidload ios swift
我正在构建一个应用程序(在XCode 8.2.1中),其中一些对象显示在2D板上,当用户点击其中一个对象时,应该将某些信息显示为样式模态信息框.我的设计是将信息写在一个单独的视图控制器中,我会在需要时显示.
我为第二个视图控制器设计了一个基本存根,并在界面构建器中为它添加了一个标签.然后我将此标签ctrl链接到我的自定义VC类:
class InfoViewController: UIViewController {
@IBOutlet weak var info: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
}
func displayInfo() {
info.attributedText = NSAttributedString(string: "abc")
}
}
Run Code Online (Sandbox Code Playgroud)
但是,当我测试我的应用程序并点击该对象时,该info字段nil甚至在viewDidLoad()我的自定义VC类的方法中.我正在显示我的VC的方式如下:
let infoViewController = InfoViewController()
infoViewController.modalPresentationStyle = .overCurrentContext
self.present(infoViewController, animated: true, completion: nil)
infoViewController.displayInfo()
Run Code Online (Sandbox Code Playgroud)
(注意:最后我将只有一个实例,InfoViewController但这只是用于测试.我不希望全局实例会有任何区别吗?)
正如我所说,无论是在viewDidLoad()方法内部还是在displayInfo()方法中,info总是nil如此,设置其attributedString属性会使应用程序崩溃.认为这个present方法可能是异步调用的,我试过displayInfo()从内部调用viewDidLoad(),但这没有任何区别.
任何人都可以告诉我我忘记了什么会让我IBOutlet正确地初始化吗?
谢谢!
大卫
Rob*_*Rob 20
问题是引用InfoViewController(),它独立于任何故事板场景实例化视图控制器.你想用instantiateViewController:
let infoViewController = storyboard?.instantiateViewController(withIdentifier: "Info") as! InfoViewController
infoViewController.modalPresentationStyle = .overCurrentContext
present(infoViewController, animated: true) {
infoViewController.displayInfo()
}
Run Code Online (Sandbox Code Playgroud)
几个笔记:
这假定(a)你已经在故事板中给出了一个"故事板id"; (b)您已将该场景的基类设置为InfoViewController.
注意,我调用displayInfo了完成处理程序,present因为你可能不希望调用直到场景出现并连接出口.
或者,您可以InfoViewController在实例化后立即更新它的非出口属性,然后让它viewDidLoad获取这些属性并更新出口,例如:
class InfoViewController: UIViewController {
var info: String!
@IBOutlet weak var infoLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
infoLabel.attributedText = NSAttributedString(string: info)
}
}
Run Code Online (Sandbox Code Playgroud)
注意,我更改了@IBOutlet名称infoLabel并添加了String名为的属性info.这往往是惯例,出口带有一些后缀,表示控制的类型,而模型对象,如String属性,没有后缀.(您只需要确保在IB中的连接检查器中删除旧的插座,这样您就不会遇到这些属性名称更改的问题.)
无论如何,你可以这样做:
let infoViewController = storyboard?.instantiateViewController(withIdentifier: "Info") as! InfoViewController
infoViewController.info = "abc"
infoViewController.modalPresentationStyle = .overCurrentContext
present(infoViewController, animated: true, completion: nil)
Run Code Online (Sandbox Code Playgroud)
关键点是在实例化之后不要立即尝试更新场景的出口,但要确保将其推迟到viewDidLoad调用之后.
| 归档时间: |
|
| 查看次数: |
8661 次 |
| 最近记录: |