致命错误:在展开可选值时意外发现nil:Swift,Core Data

时间:2015-11-06 04:05:18

标签: swift core-data ios8.3

我收到错误: let indexPath = self.menuTable.indexPathForSelectedRow()!。 似乎我没有从indexPathForSelectedRow获得价值。我正在从CSV文件解析为Core Data。不确定是否重要。我不熟悉编码,所以不确定我是否遗漏了一些明显的东西。

import UIKit
import CoreData

class MenuTableViewController: UITableViewController {

    @IBOutlet var menuTable: UITableView!
    private var menuItems:[MenuItem] = []
    var fetchResultController:NSFetchedResultsController!

    override func viewDidLoad() {
        super.viewDidLoad()

        // Load menu items from database
        if let managedObjectContext = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext {
            let fetchRequest = NSFetchRequest(entityName: "MenuItem")
            var e: NSError?
            menuItems = managedObjectContext.executeFetchRequest(fetchRequest, error: &e) as! [MenuItem]
            if e != nil {
                println("Failed to retrieve record: \(e!.localizedDescription)")
            }
        }

        // Make the cell self size
        self.tableView.estimatedRowHeight = 66.0
        self.tableView.rowHeight = UITableViewAutomaticDimension
        self.tableView.layoutIfNeeded()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    // MARK: - Table view data source

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        // Return the number of sections.
        return 1
    }

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // Return the number of rows in the section.
        return menuItems.count
    }

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = menuTable.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! MenuTableViewCell

        // Configure the cell...
        cell.nameLabel.text = menuItems[indexPath.row].name
        cell.detailLabel.text = menuItems[indexPath.row].detail
//        cell.priceLabel.text = "$\(menuItems[indexPath.row].price as! Double)"

        return cell
    }

    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)
    {
        self.performSegueWithIdentifier("showFront", sender: self)

    }

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?)
    {
        if (segue.identifier == "showFront")
        {
            var upcoming: CardFrontViewController = segue.destinationViewController as! CardFrontViewController

            let indexPath = self.menuTable.indexPathForSelectedRow()!

            let titleString = menuItems[indexPath.row].name

            upcoming.titleStringViaSegue = titleString

            self.menuTable.deselectRowAtIndexPath(indexPath, animated: true)

        }
    }

}

3 个答案:

答案 0 :(得分:0)

由于您有tableView:didSelectRowAtIndexPath:的实现,并且单元格连接到故事板中的segue,因此segue发生了两次。执行segue的第二次没有选择,因为你在第一次segue期间取消选择它。您可以通过删除tableView:didSelectRowAtIndexPath:的实现或在视图控制器本身作为源而不是单元格创建故事板中的segue并离开手动调用segue来解决此问题。

答案 1 :(得分:0)

我不知道这是否是问题,但如果你需要indexPath,为什么你使用self作为发送者呢?

尝试:

 override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)
    {
        self.performSegueWithIdentifier("showFront", sender: indexPath)

    }

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?)
    {
        if (segue.identifier == "showFront")
        {
            var upcoming: CardFrontViewController = segue.destinationViewController as! CardFrontViewController


            let titleString = menuItems[indexPath.row].name

            upcoming.titleStringViaSegue = titleString

            self.menuTable.deselectRowAtIndexPath(indexPath, animated: true)

        }
    }

答案 2 :(得分:0)

我发现您使用的是UITableViewController。在UITableViewControllerUITableView会自动为您创建所需的插座。您可以通过self.tableView在代码中访问它。我的猜测是,您没有为IBOutlet UITableView menuTable关联indexPath。因此,展开时可选的nil不是UITableView而是IBOutlet

<强>修正: 删除menuTable以及使用self.tableView变量的所有地方,然后使用.btn-disabled { -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=50)"; /* IE 8 */ filter: alpha(opacity=50); /* IE 5-7 */ -moz-opacity: 0.5; /* Netscape - firefox */ -khtml-opacity: 0.5; /* Safari 1.x */ opacity: 0.5; /* Good browsers */ pointer-events: none; cursor: default; }