【问题标题】:Optional unwrap fail, when outlets connected properly当插座正确连接时,可选展开失败
【发布时间】:2015-12-17 18:15:25
【问题描述】:

我正在开发简单的应用程序,用户可以在其中登录并阅读网络上的文章。我最近添加了一个代码,它在处理 segue 时在第二个视图中设置标题,但不幸的是我在第二页的标题是 nil。我在情节提要中有一个对象正确连接到视图控制器中的变量,我检查了两次。我不知道该怎么办,也许我没有正确解开一些东西。

代码:

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 甚至不知道下一个视图将具有什么类型,我该如何正确设置属性?

【问题讨论】:

    标签: ios swift null optional unwrap


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 你说我应该将它传递给该类的另一个属性,而不是 UI 元素?
    • 是的。您可以根据需要分配给所有属性,而不是 UI 元素。 (这只有 99% 是正确的,但我不会告诉你例外情况,因为这是一个肮脏、肮脏的 hack!:))
    • 谢谢,我从没想过 Swift 这么懒:)
    猜你喜欢
    • 2014-09-26
    • 1970-01-01
    • 2021-12-31
    • 2016-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-03
    • 1970-01-01
    相关资源
    最近更新 更多