繁体   English   中英

快速处理表格视图控制器的详细信息页面

[英]handle detail page for table view controller in swift

我有一个带有单元格的表视图控制器。 单击单元格时,我加载了另一个视图控制器,并且我想处理该视图控制器上的元素。 在详细信息视图控制器上,我放置了一个标签,并且第一步要设置标签的文本,但出现一个fatal error: unexpectedly found nil while unwrapping an Optional value的异常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.
    }
}

谢谢!

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

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

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中删除标签的插座连接并重新创建它。

快速:

    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

    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM