当插座正确连接时,可选展开失败

时间:2015-12-17 18:15:26

标签: ios swift null optional unwrap

我正在开发简单的应用,用户登录并可以从网上阅读文章。我最近添加了一个代码,在处理segue时在第二个视图中设置标题,但我在第二页的标题不幸为零。我在storyboard中有一个对象正确连接到视图控制器中的变量,我检查了两次。我不知道该怎么做,也许我已经解开了不合适的东西。

代码:

import UIKit

class MainViewController: UIViewController, UITabBarDelegate, UITabBarControllerDelegate, UIToolbarDelegate {
    @IBOutlet var titleLabel: UILabel!

    @IBOutlet var newsBar: UIToolbar!
    @IBOutlet var accountBar: UITabBar!

    override func viewDidLoad() {
        super.viewDidLoad()

        accountBar.delegate = self
        newsBar.delegate = self

        titleLabel.backgroundColor = UIColor(netHex: 0x00B0E4)

        titleLabel.textColor = UIColor.whiteColor()
        titleLabel.font = UIFont.boldSystemFontOfSize(16.0)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    override func shouldPerformSegueWithIdentifier(identifier: String, sender: AnyObject?) -> Bool {
        return true
    }

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        let next: SectionViewController = segue.destinationViewController as! SectionViewController

        switch segue.identifier! {
            case "hardwareSectionSegue":
                next.titleLabel.text = "Rubrika o hardwaru"

            case "softwareSectionSegue":
                next.titleLabel.text = "Rubrika o softwaru"

            case "webSectionSegue":
                next.titleLabel.text = "Rubrika o webových technologiích"

            case "programmerSectionSegue":
                next.titleLabel.text = "Rubrika o programování"

            case "mobileSectionSegue":
                next.titleLabel.text = "Rubrika o mobilních zažízeních"

            default:
                next.titleLabel.text = "Rubrika nenalezena"

                next.titleLabel.backgroundColor = UIColor.redColor()
        }
    }

    @IBAction func unwindSegue(unwindSegue: UIStoryboardSegue) {}
}

例外情况发生在第一种情况下,我尝试将值分配给next.titleLabel.text。它说titleLabel是零,这是不可能的。

SectionViewController:

import UIKit

class SectionViewController: UIViewController {
    @IBOutlet var titleLabel: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}

我很确定它是由该类型转换引起的,但是如果segue甚至不知道下一个视图会有什么类型,那么我该如何正确设置属性呢?

1 个答案:

答案 0 :(得分:2)

我可以看到你正在尝试做什么,但我担心iOS不会让你这样做。在prepareForSegue()方法中,您尝试通过直接设置文本值来修改正在创建的视图控制器。

iOS懒惰加载尽可能多,这意味着在程序的这一点上标签实际上并未创建 - 它实际上是nil。如果在该行上放置断点,则应该能够在调试器窗口中运行po next.titleLabel以查看nil返回。如果您首先运行po next.view,它将强制iOS创建视图及其所有子视图,此时再次运行po next.titleLabel将按预期工作。

如果您尝试在Xcode中创建模板Master-Detail Application项目,您将看到正确的解决方案:在新视图控制器中设置属性,然后将该值传输到viewDidLoad()中的标签。

摘要:当您从视图控制器A导航到视图控制器B时,请勿尝试配置B的UI。相反,向B发送它需要的值,并让B自行配置。