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()运行之前连接所有插座