gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 08:33:47 24 4
gpt4 key购买 nike

我正在创建一个轮播,其中将有 3-4 个 View Controller 。我在 Storyboard中创建了一个 View Controller ,并在 viewDidLoad() 中设置了 IBOutlets。我的计划是实例化这些 ViewController 并动态更改它们的 iboutlets。由于它们的 viewDidLoad 函数将在加载时调用,因此这是我设置 iboutlet 元素的地方。这是自定义 View Controller 代码:

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。具体报错信息是:

fatal error: unexpectedly found nil while unwrapping an Optional value

我将 Storyboard 中的 View Controller 链接到类我检查了 socket 。当我将鼠标悬停在每个元素上时,相应的 UI 元素会在 Storyboard上突出显示。我的猜测是,关于如何创建 View Controller 的流程,可能有一些我不知道的事情。谁能帮忙?谢谢

编辑:我在 viewDidLoad() 之上添加了 super.viewDidLoad(),还是一样的问题

Edit2:这就是我创建和使用 View Controller 的方式:

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 给出的答案是正确的。应该使用 Storyboard 来实例化 UIViewControllers 以实现此功能。还有另一种解决方案:Create UIViewController with nib(在创建 UIViewController 类时勾选该框)并在方便的 init 方法调用中

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

最佳答案

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

只需等待您的 View 在 viewDidLayoutSubviews 中呈现,然后进行更改。不要忘记只执行一次,因为 viewDidLayoutSubviews 被调用了很多。

var first = false

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

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

编辑

我第一眼没看出问题,但您是从头开始创建 View Controller !您必须使用 Storyboard实例化它们,否则您的 IBOutlets 将不会被设置 ;)

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

希望这会有所帮助!

关于ios - 当我尝试在 viewDidLoad 中设置 IBOutlet 元素时,它们为零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31561054/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com