我正在尝试创建一个简单的联系人列表应用程序,作为学习Swift的途径。不幸的是,无论我尝试什么,我都无法将联系人的详细信息显示在与表视图(包含主要联系人)不同的视图控制器上的可编辑文本字段中。
这是应该影响文本字段的代码块(我不确定要提供什么其他代码)
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "showDetail" {
if let indexPath = self.tableView.indexPathForSelectedRow {
let object = objects[indexPath.row]
let controller = (segue.destinationViewController as! UINavigationController).topViewController as! DetailViewController
print(object.firstName)
controller.fiName?.text = object.firstName
controller.laName?.text = object.lastName
controller.miName?.text = object.middleName
controller.aess?.text = object.address
controller.phoNumber?.text = object.phoneNumber
controller.yearBirth?.text = String(object.age)
print(controller.fiName)
controller.detailItem = object
controller.navigationItem.leftBarButtonItem = self.splitViewController?.displayModeButtonItem()
controller.navigationItem.leftItemsSupplementBackButton = true
}
}
第一行打印的结果与我预期的一样,这是联系人的名称,但程序在第二行打印时崩溃,出现"EXC_BAD_INSTRUCTION"/致命错误:在展开时意外发现nil和可选值。
为什么我不能设置控制器.fiName?。文本提前感谢您的帮助。
我猜您的filName
是UILabel
还是UITextField
?
如果你在DetailViewController
中检查你的代码,你会注意到这一行:
@IBOutlet weak var filName: UITextField!
你看到线路尽头的!
了吗?
这意味着,变量(又名出口)filName
不能在初始化时设置,但将在稍后的某个时刻设置。
现在,您要做的是初始化您的类,并尝试访问在初始化时尚未设置的属性。
要解决此问题,请在DetailViewController
中创建一个对象实例,并将该实例设置为所选对象,然后在viewDidLoad
函数中设置标签属性。
类似这样的东西:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "showDetail" {
if let indexPath = self.tableView.indexPathForSelectedRow {
let object = objects[indexPath.row]
let controller = (segue.destinationViewController as! UINavigationController).topViewController as! DetailViewController
controller.object = object
}
}
然后在DetailViewController
的viewDidLoad
中:
override viewDidLoad() {
fiName?.text = object.firstName
laName?.text = object.lastName
miName?.text = object.middleName
aess?.text = object.address
phoNumber?.text = object.phoneNumber
yearBirth?.text = String(object.age)
navigationItem.leftBarButtonItem = self.splitViewController?.displayModeButtonItem()
navigationItem.leftItemsSupplementBackButton = true
}
您设置fiName标签文本太早,标签尚未分配。相反,通过对象,然后在下一个控制器的viewDidLoad中设置文本。
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "showDetail" {
if let indexPath = self.tableView.indexPathForSelectedRow {
let object = objects[indexPath.row]
let controller = (segue.destinationViewController as! UINavigationController).topViewController as! DetailViewController
//pass through object:
controller.object = object
print(object)
}
}
然后在下一个视图Controller视图DidLoad中设置文本:
override viewDidLoad() {
//Now set the text value here:
fiName?.text = object.firstName
}
只应在prepareForSegue
中传递对象
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "showDetail" {
if let indexPath = self.tableView.indexPathForSelectedRow {
let object = objects[indexPath.row]
let controller = (segue.destinationViewController as! UINavigationController).topViewController as! DetailViewController
controller.detailItem = object
controller.navigationItem.leftBarButtonItem = self.splitViewController?.displayModeButtonItem()
controller.navigationItem.leftItemsSupplementBackButton = true
}
}
}
然后应在viewDidLoad
中设置出口
class DetailViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
fiName?.text = detailItem.firstName
laName?.text = detailItem.lastName
miName?.text = detailItem.middleName
aess?.text = detailItem.address
phoNumber?.text = detailItem.phoneNumber
yearBirth?.text = String(detailItem.age)
}
}