我有一个带有单元格的表视图控制器。单击一个单元格我加载另一个视图控制器,我想处理此视图控制器上的元素。在详细视图控制器上我放置了一个标签,在第一步中我想设置标签的文本,但我得到一个例外fatal error: unexpectedly found nil while unwrapping an Optional value
,我不知道为什么。有没有解决方案?
这是我的表视图控制器中单击一个单元格的一部分:
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
let vcMissionDetail : ViewControllerMissionDetail = self.storyboard?.instantiateViewControllerWithIdentifier("MissionDetail") as ViewControllerMissionDetail;
//load detail view controller
self.presentViewController(vcMissionDetail, animated: true, completion: nil)
//set label text
//at this line I get the exception -> label is nil
vcMissionDetail.label.text = "Test"
}
这是我的详细视图控制器(非常简单):
import UIKit
class ViewControllerMissionDetail: UIViewController {
@IBOutlet var label: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
THX!
答案 0 :(得分:0)
我认为解决问题的方法非常简单。如果我理解正确,您希望在使用didSelectRowAtIndexPath从表视图控制器中删除时更改详细视图控制器上的标签。 您可能犯错的地方是,您正在尝试从表视图控制器更改详细视图控制器中的标签。 解决问题的正确方法是在详细视图控制器的'viewDidLoad'或'viewDidAppear'方法中设置标签文本。
override func viewDidLoad() {
super.viewDidLoad()
//set label text here
}
override func viewDidAppear() {
super.viewDidLoad()
//OR set label text here
}
答案 1 :(得分:0)
instantiateViewControllerWithIdentifier
返回一个可选项,因为它可能由于多种原因而失败。所以你最好有条件地打开它:
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
if let vcMissionDetail : ViewControllerMissionDetail = self.storyboard?.instantiateViewControllerWithIdentifier("MissionDetail") as ViewControllerMissionDetail {
//set label text before presenting the viewController
vcMissionDetail.label.text = "Test"
//load detail view controller
self.presentViewController(vcMissionDetail, animated: true, completion: nil)
}
}
进一步检查:
在InterfaceBuilder的身份检查器中将ViewControllerMissionDetail
设置为viewController的自定义类吗?
如果vcMissionDetail
成功实例化并且仍然崩溃,则删除InterfaceBuilder中标签的出口连接并重新创建。
答案 2 :(得分:0)
对于swift:
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
self.performSegueWithIdentifier("showItemDetail", sender: tableView)
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
if segue.identifier == "showItemDetail" {
let indexPath:NSIndexPath = self.tableView.indexPathForSelectedRow()!
let detailVC:ItemDetailViewController = segue.destinationViewController as ItemDetailViewController
detailVC.item = items[indexPath.row] as Item
}
}