我是Swift的新手,所以下面的问题可能是一个非常基本的问题。另外,这是我在stackoverflow.com上的第一次!
在实例化视图控制器中设置UILabels的文本属性时,我得到了"线程1:致命错误:在展开可选值时意外发现nil"。
我正在制作一个简单的应用程序,显示我家里的药品清单和有效期。一个表视图控制器显示了一个名为medArray的数组中的药物列表,当点击每个药物时,我希望它加载一个包含一些进一步详细信息的详细屏幕。
我使用IB设置了一个DetailView控制器,并创建了3个UILabels:的出口连接
// DetailView.swift
// HomeMed
//
// Created by Joao Boavida on 10/12/2018.
// Copyright © 2018 Joao Boavida. All rights reserved.
//
import UIKit
class DetailView: UIViewController {
@IBOutlet var nameLbl: UILabel!
@IBOutlet var subtextLbl: UILabel!
@IBOutlet var expdateLbl: UILabel!
}
我认为连接是成功的,因为左边排水沟上的点是实心的。我在点击表视图单元格时确实收到了错误,该单元格调用以下代码:
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let medicine = medArray[indexPath.row]
if let vc = storyboard?.instantiateViewController(withIdentifier: "DetailView") as? DetailView {
vc.nameLbl.text = medicine.name
if let subtext = medicine.subtext {
vc.subtextLbl.text = subtext
} else {
vc.subtextLbl.text = ""
}
let ISOdateFormatter = ISO8601DateFormatter()
ISOdateFormatter.formatOptions = [.withMonth, .withYear, .withDashSeparatorInDate]
vc.expdateLbl.text = "Exp: (ISOdateFormatter.string(from: medicine.expiry))"
navigationController?.pushViewController(vc, animated: true)
}
}
我一尝试访问vc.nameLbl.text就收到错误,由于我不知道的原因,该错误为零。vc.expdateLbl和vc.subtextLbl也为零。
"vc"视图控制器似乎被正确地实例化了,因为如果我省略了配置代码,并在创建后推送它,它会显示良好,尽管我在IB中设置的标签中有初始文本。只有当我试图更改这些标签时,它才会崩溃。
我尝试过建立和重新建立出口连接,但没有成功。有人能帮忙解决这个问题吗?
非常感谢!
您在这里设置VC的出口,对吗?
vc.nameLbl.text = medicine.name <---
if let subtext = medicine.subtext {
vc.subtextLbl.text = subtext <---
} else {
vc.subtextLbl.text = "" <---
}
...
vc.expdateLbl.text = "Exp: (ISOdateFormatter.string(from: medicine.expiry))" <---
当运行上述代码时,出口nameLbl
、subtextLbl
和expdateLbl
均为零。他们还没有确定在那个时间点。
调用viewDidLoad
时,出口已设置。因此,您可以在DetailView
:中添加三个属性
var name: String!
var subtext: String!
var expdate: String!
您不设置出口,而是设置以上三个属性:
vc.name = medicine.name <---
if let subtext = medicine.subtext {
vc.subtext = subtext <---
} else {
vc.subtext = "" <---
}
...
vc.expdat = "Exp: (ISOdateFormatter.string(from: medicine.expiry))" <---
然后,在DetailView
中,将属性分配给viewDidLoad
:中标签的text
override func viewDidLoad() {
nameLbl.text = name
subtextLbl.text = subtext
expdateLbl.text = expdate
}
它崩溃是因为您试图在加载UILabel
之前访问它。因此,您应该致电vc.loadViewIfNeeded()
。这将加载所有UIViewController
视图。