Ios swift中表格视图控制器的句柄详细信息页面

Ios swift中表格视图控制器的句柄详细信息页面,ios,uitableview,swift,uiviewcontroller,Ios,Uitableview,Swift,Uiviewcontroller,我有一个带有单元格的表视图控制器。单击单元后,我将加载另一个视图控制器,并希望处理此视图控制器上的元素。在局部视图控制器上,我放置了一个标签,在第一步中,我想设置标签的文本,但是我得到了一个异常致命错误:在展开可选值时意外地发现了nil,我不知道为什么。有什么解决办法吗 这是单击单元格时“我的表视图”控制器的一部分: override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndex

我有一个带有单元格的表视图控制器。单击单元后,我将加载另一个视图控制器,并希望处理此视图控制器上的元素。在局部视图控制器上,我放置了一个标签,在第一步中,我想设置标签的文本,但是我得到了一个异常致命错误:在展开可选值时意外地发现了nil,我不知道为什么。有什么解决办法吗

这是单击单元格时“我的表视图”控制器的一部分:

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.
    }
}

谢谢

我认为解决你问题的方法很简单。如果我理解正确,则在使用didSelectRowAtIndexPath从表视图控制器分离时,您希望更改详图视图控制器上的标签。 您可能犯错误的地方是,您正试图从“表视图”控制器更改“局部视图”控制器中的标签。 解决问题的正确方法是在局部视图控制器的“viewDidLoad”或“ViewDidAspect”方法中设置标签文本

override func viewDidLoad() {
    super.viewDidLoad()
    //set label text here
}
override func viewDidAppear() {
    super.viewDidLoad()
    //OR set label text here
}
InstanceViewController WithiIdentifier返回一个可选的,因为它可能由于多种原因而失败。因此,您最好有条件地展开它:

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)
    }
}
需要再次检查的其他事项:

ViewControllerMissionDetail是否设置为InterfaceBuilder中标识检查器中viewController的自定义类

如果vCommissionDetail已成功实例化,但仍然崩溃,则在InterfaceBuilder中删除标签的插座连接并重新创建它。

对于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

    }
}

错误指向哪一行代码?您得到该错误是因为标签为零。您是否忘记将标签连接到情节提要中的UILabel?在vCommissionDetail.label.text=Test行中,我得到了异常。我还使用label变量see@IBOutlet var label:UILabel引用了故事板中细节视图控制器中的标签!但这必须是可能的,因为稍后我想用表视图单元格的信息设置标签文本。此信息仅存在于表视图控制器中,还是?我在表视图控制器中安装了细节视图控制器。我能理解。我也处于类似的情况。这是我使用的方法。这可能不是解决你的问题的最佳方法,但对我来说很有效。在表视图控制器的didSelectRowAtIndexPath方法中,将选定行的单元格数据存储在全局变量中。现在,您可以在详细视图控制器中使用此全局变量来设置标签文本。我做了您提到的事情,但没有成功。昨天我认为代码是有效的,但我不确定。这可能是xcode中的错误吗?我打赌您的IBOutlet连接到标签是无效的。您是否尝试删除并重新创建连接?是的,我尝试了。我还添加了一个新标签来检查它,但有同样的问题。我认识到一件事……在详细视图控制器中为第二个标签创建第二个IBOutlet之后,这个标签没有我在表视图控制器中所称的自动完成条目。也许这是Xcode的问题?我重新安装了Xcode,但未成功。您的自定义类可能未在标识检查器中设置。自定义类已设置为ViewControllerMissionDetail。我想这不是问题所在。