当我尝试在 viewDidLoad 中设置 IBOutlet 元素时,它们为零
IBOutlet elements come out nil when I try to set them in viewDidLoad
我正在创建一个旋转木马,其中将有 3-4 个视图控制器。我在情节提要中创建了一个 viewcontroller 并在 viewDidLoad() 中设置了 IBOutlets。我的计划是实例化这些 ViewController 并动态更改它们的 iboutlets.Since 它们的 viewDidLoad 函数将在加载时调用,这是我设置 iboutlet 的地方 elements.here 是自定义视图控制器代码:
import UIKit
class CarouselViewController: UIViewController {
@IBOutlet weak var imageView: UIImageView!
@IBOutlet weak var label: UILabel!
var imageName: String?
var bottomText: String?
convenience init(imageName: String, bottomText: String){
self.init()
self.imageName = imageName
self.bottomText = bottomText
}
override func viewDidLoad() {
if(self.imageView==nil){
println("nil")
}
self.imageView.image = UIImage(named: self.imageName!)
self.label.text = self.bottomText
}
}
这就是我实例化它的方式:
var vc1 = CarouselViewController(imageName: "tour1", bottomText: "This is view1")
但是在viewDidload()中,self.imageView出来nil.Exact错误信息是:
fatal error: unexpectedly found nil while unwrapping an Optional value
我将故事板中的视图控制器链接到 class
我检查了插座。当我将鼠标悬停在每个元素上时,相应的 UI 元素会在故事板上突出显示。
我的猜测是,关于如何创建视图控制器的流程,可能有一些我不知道的事情。谁能帮忙?谢谢
编辑:我在 viewDidLoad() 之上添加了 super.viewDidLoad(),仍然是同样的问题
Edit2:这就是我创建和使用 viewcontrollers 的方式:
var vc1 = CarouselViewController(imageName: "tour1", bottomText: "This is view1")
var vc2 = CarouselViewController(imageName: "tour2", bottomText: "This is view2")
let pages = PagesController([vc1, vc2])
self.presentViewController(pages, animated: true) { () -> Void in
pages.goTo(0)
}
Edit3:找到解决方案,@Roux 给出的答案是正确的。应该使用情节提要来实例化 UIViewControllers 以实现此功能。还有另一种解决方案:Create UIViewController with nib(create UIViewController class时勾选) and in convenience init method call
self.init(nibname:"NibName", bundle: nil)
您可以尝试在访问任何视图对象之前调用 Super-类 viewDidLoad 吗?
喜欢
override func viewDidLoad() {
super.viewDidLoad()
if(self.imageView==nil){
println("nil")
}
self.imageView.image = UIImage(named: self.imageName!)
self.label.text = self.bottomText
}
我在 iOS7 下在非常慢的设备上遇到了同样的问题。
只需等待您的视图在 viewDidLayoutSubviews 中呈现,然后进行更改。
不要忘记只执行一次,因为 viewDidLayoutSubviews 被调用了很多。
var first = false
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
if self.first {
//Update your views
self.first = false
}
}
您也可以使用 view.layoutSubviews(),但我建议您不要使用 ;)
编辑
我第一眼没看出问题,但您是从头开始创建视图控制器!您必须使用故事板实例化它们,否则您的 IBOutlets 将不会被设置 ;)
var vc1 = storyboard?.instantiateViewControllerWithIdentifier("YourControllerStoryboardId") as! CarouselViewController
希望对您有所帮助!
一个更简单的方法(在我看来)是使用 awakeFromNib() 代替 viewDidLoad()。这更直接地连接到 IBOutlets,因此它们应该在调用 awakeFromNib() 时加载。
我正在创建一个旋转木马,其中将有 3-4 个视图控制器。我在情节提要中创建了一个 viewcontroller 并在 viewDidLoad() 中设置了 IBOutlets。我的计划是实例化这些 ViewController 并动态更改它们的 iboutlets.Since 它们的 viewDidLoad 函数将在加载时调用,这是我设置 iboutlet 的地方 elements.here 是自定义视图控制器代码:
import UIKit
class CarouselViewController: UIViewController {
@IBOutlet weak var imageView: UIImageView!
@IBOutlet weak var label: UILabel!
var imageName: String?
var bottomText: String?
convenience init(imageName: String, bottomText: String){
self.init()
self.imageName = imageName
self.bottomText = bottomText
}
override func viewDidLoad() {
if(self.imageView==nil){
println("nil")
}
self.imageView.image = UIImage(named: self.imageName!)
self.label.text = self.bottomText
}
}
这就是我实例化它的方式:
var vc1 = CarouselViewController(imageName: "tour1", bottomText: "This is view1")
但是在viewDidload()中,self.imageView出来nil.Exact错误信息是:
fatal error: unexpectedly found nil while unwrapping an Optional value
我将故事板中的视图控制器链接到 class 我检查了插座。当我将鼠标悬停在每个元素上时,相应的 UI 元素会在故事板上突出显示。 我的猜测是,关于如何创建视图控制器的流程,可能有一些我不知道的事情。谁能帮忙?谢谢
编辑:我在 viewDidLoad() 之上添加了 super.viewDidLoad(),仍然是同样的问题
Edit2:这就是我创建和使用 viewcontrollers 的方式:
var vc1 = CarouselViewController(imageName: "tour1", bottomText: "This is view1")
var vc2 = CarouselViewController(imageName: "tour2", bottomText: "This is view2")
let pages = PagesController([vc1, vc2])
self.presentViewController(pages, animated: true) { () -> Void in
pages.goTo(0)
}
Edit3:找到解决方案,@Roux 给出的答案是正确的。应该使用情节提要来实例化 UIViewControllers 以实现此功能。还有另一种解决方案:Create UIViewController with nib(create UIViewController class时勾选) and in convenience init method call
self.init(nibname:"NibName", bundle: nil)
您可以尝试在访问任何视图对象之前调用 Super-类 viewDidLoad 吗?
喜欢
override func viewDidLoad() {
super.viewDidLoad()
if(self.imageView==nil){
println("nil")
}
self.imageView.image = UIImage(named: self.imageName!)
self.label.text = self.bottomText
}
我在 iOS7 下在非常慢的设备上遇到了同样的问题。
只需等待您的视图在 viewDidLayoutSubviews 中呈现,然后进行更改。 不要忘记只执行一次,因为 viewDidLayoutSubviews 被调用了很多。
var first = false
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
if self.first {
//Update your views
self.first = false
}
}
您也可以使用 view.layoutSubviews(),但我建议您不要使用 ;)
编辑
我第一眼没看出问题,但您是从头开始创建视图控制器!您必须使用故事板实例化它们,否则您的 IBOutlets 将不会被设置 ;)
var vc1 = storyboard?.instantiateViewControllerWithIdentifier("YourControllerStoryboardId") as! CarouselViewController
希望对您有所帮助!
一个更简单的方法(在我看来)是使用 awakeFromNib() 代替 viewDidLoad()。这更直接地连接到 IBOutlets,因此它们应该在调用 awakeFromNib() 时加载。