首页 文章

当我尝试在viewDidLoad中设置它们时,IBOutlet元素为零

提问于
浏览
4

我正在创建一个旋转木马,其中将有3-4个视图控制器 . 我在storyboard中创建了一个viewcontroller,并在viewDidLoad()中设置了IBOutlets . 我的计划是实例化这些ViewControllers并动态更改它们的iboutlets . 由于它们的viewDidLoad函数在加载时会被调用,这就是我设置iboutlet元素的地方 . 这是自定义视图控制器代码:

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

我将故事板中的视图控制器链接到我检查插座的类 . 当我将鼠标悬停在每个上面时,相应的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)
    }

编辑3:找到解决方案,由@Roux给出的答案是正确的 . 应该使用故事板实例化UIViewControllers来实现此功能 . 还有另一个解决方案:使用nib创建UIViewController(在创建UIViewController类时勾选方框)和方便的init方法调用

self.init(nibname:"NibName", bundle: nil)

3 回答

  • 0

    在非常慢的设备上,我在iOS7下遇到了同样的问题 .

    只需等待您的视图在viewDidLayoutSubviews中呈现,然后进行更改 . 不要忘记这样做一次虽然viewDidLayoutSubviews被大量调用 .

    var first = false
    
    override func viewDidLayoutSubviews() { 
        super.viewDidLayoutSubviews()
        if self.first {
            //Update your views
            self.first = false
        }
    }
    

    你也可以使用view.layoutSubviews(),但我建议你不要;)

    EDIT

    我没有看到问题,但你是从头开始创建视图控制器!您必须使用故事板实例化它们,否则您的IBOutlets将不会被设置;)

    var vc1 = storyboard?.instantiateViewControllerWithIdentifier("YourControllerStoryboardId") as! CarouselViewController
    

    希望这会有所帮助!

  • 3

    你可以在访问任何视图对象之前尝试调用超类viewDidLoad吗?

    喜欢

    override func viewDidLoad() {
        super.viewDidLoad()
        if(self.imageView==nil){
            println("nil")
        }
        self.imageView.image = UIImage(named: self.imageName!)
        self.label.text = self.bottomText
    }
    
  • 0

    更简单的方法(在我看来)是使用awakeFromNib()代替viewDidLoad() . 这更直接地连接到IBOutlets,因此它们应该在调用awakeFromNib()时加载 .

相关问题