在swift中处理表视图控制器的详细信息

问题描述:

我有一个带有单元的表视图控制器。在单击一个单元格时我加载了另一个视图控制器,并且我想处理这个视图控制器上的元素。在详细视图控制器上,我放置了一个标签,并在第一步中设置标签的文本,但我得到一个异常fatal error: unexpectedly found nil while unwrapping an Optional value,我不知道为什么。有没有解决方案?在swift中处理表视图控制器的详细信息

这是我的表视图控制器的部分上单击单元格:

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

哪一行的代码执行错误点? – 2014-11-08 16:21:58

+0

由于标签为零,您正在收到该错误。您是否忘记将标签连接到故事板中的UILabel? – 2014-11-08 16:25:42

+0

在线'vcMissionDetail.label.text =“Test”'我得到异常。而且我还用'label'变量在故事板中引用了详细视图控制器中的标签(请参阅'@IBOutlet var label:UILabel!') – Martin 2014-11-08 16:33:59

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

而且事情仔细检查:

ViewControllerMissionDetail设置为在InterfaceBuilder中的身份检查你的viewController自定义类?

如果vcMissionDetail已成功实例化并且仍然崩溃,请在InterfaceBuilder中删除标签的出口连接并重新创建它。

+0

我做了你提到的事情,但没有成功。昨天我认为代码有效,但我不确定。它有可能是xcode中的一个bug吗? – Martin 2014-11-08 17:52:17

+0

我打赌你的IBOutlet连接到标签是无效的。您是否尝试删除并重新创建连接? – zisoft 2014-11-08 18:08:02

+0

是的,我做到了。而且我还添加了一个新标签来检查它,但是也出现了同样的问题。我认识的一件事是......在为详细视图控制器中的第二个标签创建第二个IBOutlet之后,我没有在表格视图控制器中调用该标签的自动填充条目。也许这是Xcode的问题?我重新安装了Xcode,但没有成功。 – Martin 2014-11-08 18:41:00

我认为解决您的问题非常简单。如果我理解正确,当您使用didSelectRowAtIndexPath从表视图控制器中继续时,您想要更改详细信息视图控制器上的标签。 您可能犯了一个错误的地方是,您正尝试从表视图控制器中更改详细视图控制器中的标签。 解决问题的正确方法是在详细视图控制器的'viewDidLoad'或'viewDidAppear'方法中设置标签文本。

override func viewDidLoad() { 
    super.viewDidLoad() 
    //set label text here 
} 
override func viewDidAppear() { 
    super.viewDidLoad() 
    //OR set label text here 
} 
+0

但它必须是可能的,因为稍后我要设置带有标签文本的信息表格视图单元格。这些信息我只在桌面视图控制器或?我在桌面视图控制器中安装了详细视图控制器。 – Martin 2014-11-08 16:37:41

+0

我能理解。我处于类似的情况。这是我使用的方法(它可能不是解决问题的最佳方式,但它对我有用)。在表视图控制器的didSelectRowAtIndexPath方法中,将所选行的单元格数据存储在全局变量中。现在,您可以在详细视图控制器中使用此全局变量来设置标签文本。 – 2014-11-08 17:40:56

为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 

    } 
}