Swift:无法更改实例化视图控制器中的属性



我是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))" <---

当运行上述代码时,出口nameLblsubtextLblexpdateLbl均为零。他们还没有确定在那个时间点。

调用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视图。

最新更新