在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!
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中删除标签的出口连接并重新创建它。
我做了你提到的事情,但没有成功。昨天我认为代码有效,但我不确定。它有可能是xcode中的一个bug吗? – Martin 2014-11-08 17:52:17
我打赌你的IBOutlet连接到标签是无效的。您是否尝试删除并重新创建连接? – zisoft 2014-11-08 18:08:02
是的,我做到了。而且我还添加了一个新标签来检查它,但是也出现了同样的问题。我认识的一件事是......在为详细视图控制器中的第二个标签创建第二个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
}
但它必须是可能的,因为稍后我要设置带有标签文本的信息表格视图单元格。这些信息我只在桌面视图控制器或?我在桌面视图控制器中安装了详细视图控制器。 – Martin 2014-11-08 16:37:41
我能理解。我处于类似的情况。这是我使用的方法(它可能不是解决问题的最佳方式,但它对我有用)。在表视图控制器的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
}
}
哪一行的代码执行错误点? – 2014-11-08 16:21:58
由于标签为零,您正在收到该错误。您是否忘记将标签连接到故事板中的UILabel? – 2014-11-08 16:25:42
在线'vcMissionDetail.label.text =“Test”'我得到异常。而且我还用'label'变量在故事板中引用了详细视图控制器中的标签(请参阅'@IBOutlet var label:UILabel!') – Martin 2014-11-08 16:33:59