Swift2 展开可选值-Swift 2时发现无

Swift2 展开可选值-Swift 2时发现无,swift2,optional,Swift2,Optional,我遇到了无法解释的错误: @IBOutlet weak var licencePlateLabel: UILabel! var editItem: CarValues? { didSet { // Update the view. self.configureView() } } func configureView() { // Update the user interface fo

我遇到了无法解释的错误:

@IBOutlet weak var licencePlateLabel: UILabel!

var editItem: CarValues? {
        didSet {
            // Update the view.
            self.configureView()
        }
    }

 func configureView() {
        // Update the user interface for the detail item.

        if let editedCar = self.editItem {

            if let licencePlate = self.licencePlateLabel {
                licencePlate.text? = editedCar.licencePlate!//this gives me nil
            }
            else {
                print("value was nil")
                }

           print(editedCar.licencePlate!)//this is giving me the correct value

}
如果我更换

if let licencePlate = self.licencePlateLabel {
                    licencePlate.text! = editedCar.licencePlate!
                }//this throws an error "found nil......"
即使我这样做了,我仍然会得到“零发现…”

但是如果我把上面的代码放到viewDidLoad上,那么它就可以正常工作了

override func viewDidLoad() {  

 licencePlateLabel.text = "test"
           [...]

}
这段代码是怎么回事

编辑

我将editItem的值从detailView传递到EditView,如下所示:

  @IBAction func editButtonTapped(sender: AnyObject) {

        let storyBoard = UIStoryboard(name: "Main", bundle:nil)
        let editScreen = storyBoard.instantiateViewControllerWithIdentifier("ID_EditViewController")
        self.navigationController?.pushViewController(editScreen, animated: true)

        let controller =  EditViewController()
        controller.editItem = detailItem
        controller.navigationItem.leftBarButtonItem = self.splitViewController?.displayModeButtonItem()
        controller.navigationItem.leftItemsSupplementBackButton = true
    }

您不需要展开属性来设置它们,而只是从中读取。因此,您的代码可以是:

if let licencePlate = self.licencePlateLabel {
    licencePlate.text = editedCar.licencePlate
}

请注意,由于
licenseplate.text
是可选值,因此也不需要展开
editedCar.licenseplate
。无论它是nil还是包含字符串,都可以使用它的值。

您不需要打开属性来设置它们,只需要从中读取。因此,您的代码可以是:

if let licencePlate = self.licencePlateLabel {
    licencePlate.text = editedCar.licencePlate
}

请注意,由于
licenseplate.text
是可选值,因此也不需要展开
editedCar.licenseplate
。无论它是nil还是包含字符串,都可以使用它的值。

如果我这样做,我仍然得到nilthat@GeorgeAsda您确定
editedCar
此时具有LicensePlate值吗?您可以尝试更改if-let-to:
if-let-editedCar=self.editItem,其中editedCar.licenseplate!=nil
并设置断点以查看是否满足该条件。在if let[…]之前调用的print(editedCar.licenseplate!)不也应该给出nil吗?我运行了if let editedCar=self.editItem,其中editedCar.licenseplate!=无{我确实在打印日志中得到了值,但在标签文本上得到的值是nil@GeorgeAsda听起来您的
configureView
可能在标签IBOutlet连接之前运行。您可以打印
editedCar
中的值,而不管标签是否存在或是否已设置。因此,是的,它会打印,但标签可能为con之后连接,然后再也不设置其文本。确保在任何其他代码设置之前,先在视图控制器上调用
loadViewIfNeeded()
属性,以强制在
configureView()之前连接所有插座
code-run如果我这样做,我仍然会得到零that@GeorgeAsda您确定
editedCar
此时具有Licenseplate值吗?您可以尝试更改if-let-to-be:
if-let-editedCar=self.editItem,其中editedCar.licenseplate!=nil
,并设置断点以查看是否满足该条件。打印不应该吗(editedCar.licenseplate!)在if let[…]也给出nil之前调用哪个?我运行了if let editedCar=self.editItem,其中editedCar.licenseplate!=nil{我确实在打印日志中得到了值,但在标签文本上得到的值是nil@GeorgeAsda听起来您的
configureView
可能在标签IBOutlet连接之前运行。您可以打印
editedCar
中的值,而不管标签是否存在或是否已设置。因此,是的,它会打印,但标签可能为con之后连接,然后再也不设置其文本。确保在任何其他代码设置之前,先在视图控制器上调用
loadViewIfNeeded()
属性,以强制在
configureView()运行之前连接所有插座