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

时间:2014-11-08 16:04:34

标签: ios uitableview swift uiviewcontroller

我有一个带有单元格的表视图控制器。单击一个单元格我加载另一个视图控制器,我想处理此视图控制器上的元素。在详细视图控制器上我放置了一个标签,在第一步中我想设置标签的文本,但我得到一个例外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!

3 个答案:

答案 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

    }
}