在解开一个Optional值时出乎意料地发现了nil(swift)

时间:2015-07-16 16:25:09

标签: ios xcode swift

我在尝试更改标签的文本时遇到标题中的错误,该标签属于Page类(UIViewController的子类)

@IBAction func StartButton(sender: AnyObject) {

    for quote in quoteList {

        var newPage = Page()
        //error is on the next line:
        newPage.Label.text = quote

        pageArray!.append(newPage)
    }

}

}

这是Page class:

class Page : UIViewController{

var index: Int = 0

var parent: PageArray?

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

@IBOutlet weak var Label: UILabel!


@IBAction func previousButton(sender: AnyObject) {
}


@IBAction func gotoListButton(sender: AnyObject) {
}


@IBAction func nextButton(sender: AnyObject) {
}

}

对于快速编程和一般的iOs,我是新手;如果已经提出过类似的问题,我道歉。我先搜索过,但没有找到适合我的解决方案。 我怀疑问题在于newPage的初始化,并尝试以几种不同的方式进行,但我似乎无法做到正确。 我的问题是我到底做错了什么,我该如何解决?

编辑:让它像这样工作(通过工作我的意思是不会崩溃,什么也不做):

    @IBAction func StartButton(sender: AnyObject) {

    var pageArray: PageArray = PageArray()

    for quote in quoteList {

        var newPage = Page(nibName: "Page", bundle: nil)


        if newPage.Label != nil {
        newPage.Label.text = quote
        }

        pageArray.append(newPage)

    }

}

现在看来确定newPage.Label是nil。

2 个答案:

答案 0 :(得分:4)

好吧,pageArray可能是零,而!你假装它不是。

实例化pageArray应解决您的问题。

您可以查看第一个答案here,详细了解swift中的问题和感叹号

修改

您的问题也可能来自您的控制器初始化,您可能想尝试:

let mystoryboard:UIStoryboard = UIStoryboard(name: "storyboardName", bundle: nil)
var newPage:Page = mystoryboard.instantiateViewControllerWithIdentifier("idYouAssigned") as! Page

答案 1 :(得分:0)

我知道你的问题。从Nib加载ViewController时。实际上,在加载ViewController之前需要一段延迟时间。

以下代码可帮助您立即加载ViewController。

@IBAction func StartButton(sender: AnyObject) {

var pageArray: PageArray = PageArray()

for quote in quoteList {

    var newPage = Page(nibName: "Page", bundle: nil)

    let _ = newPage.view // A trick. It's help your view load immediate

    // Your Page has been loaded.
    newPage.Label.text = quote

    pageArray.append(newPage)

}