致命错误:在展开可选值Swift核心数据时意外发现nil

致命错误:在展开可选值Swift核心数据时意外发现nil,swift,core-data,ios8.3,Swift,Core Data,Ios8.3,我在线路上遇到错误: 让indexPath=self.menuTable.indexPathForSelectedRow()。 似乎我没有从indexPathForSelectedRow中获取值。我正在将CSV文件解析为核心数据。不知道这是否重要。我对编码还不熟悉,所以不确定我是否遗漏了一些明显的东西 import UIKit import CoreData class MenuTableViewController: UITableViewController { @IBOutle

我在线路上遇到错误:
让indexPath=self.menuTable.indexPathForSelectedRow()。
似乎我没有从
indexPathForSelectedRow
中获取值。我正在将
CSV
文件解析为
核心数据
。不知道这是否重要。我对编码还不熟悉,所以不确定我是否遗漏了一些明显的东西

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)

        }
    }

}

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

因为您有
tableView:didSelectRowAtIndexPath:
并且单元格连接到情节提要中的segue,segue发生两次。第二次执行segue时,将没有选择,因为您在第一个segue期间取消选择它。您可以通过删除tableView:DidSelectRowatinIndexPath:的实现来解决此问题,或者在故事板中创建segue,将view控制器本身作为源,而不是单元格,并保留对segue的手动调用来解决此问题。

我不知道这是否是问题,但如果您使用self作为发送方,为什么要使用self需要索引吗

尝试:


我不知道这是否是问题所在,但如果需要indexPath,为什么要使用self作为发送方

尝试:


我看到您正在使用
UITableViewController
。在
UITableViewController
中,会自动为您创建带有所需插座的
UITableView
。您可以通过
self.tableView
在代码中访问它。我猜您没有为名为
menuTable
UITableView
连接
IBOutlet
。因此,展开时为零的可选值不是
indepath
,而是
UITableView

修复:
删除您的
IBOutlet
,无论您在哪里使用
menuTable
变量,而是使用
self.tableView

我看到您使用的是
UITableViewController
。在
UITableViewController
中,会自动为您创建带有所需插座的
UITableView
。您可以通过
self.tableView
在代码中访问它。我猜您没有为名为
menuTable
UITableView
连接
IBOutlet
。因此,展开时为零的可选值不是
indepath
,而是
UITableView

修复:
删除您的
IBOutlet
,无论您在哪里使用
menuTable
变量,并改用
self.tableView

您的故事板中的单元格是否连接到序列?是的,我将单元格连接到带有标识符“showFront”的故事板序列“Show(如Push)”。您的故事板中的单元格是否连接到序列?是的,我将单元格连接到一个序列板序列,“显示(如推送)”,标识符为“showFront”。如果我不使用self作为发送者,还有什么替代方法?我是新来的。我认为这是最好的方法?..重写func prepareForSegue(segue:UIStoryboardSegue,sender:AnyObject?{if(segue.identifier==“showFront”){var:CardFrontViewController=segue.destinationViewController as!CardFrontViewController让indexPath=menuTable.indexPathForSelectedRow()!让titleString=menuItems[indexPath.row].name comming.titleStringViaSegue=titleStringSelf.menuTable.declerowatindexpath(indexath,动画:true)}'如果我不使用self作为发送者,还有什么替代方法?我是新手。我认为这是最好的方法?..重写func prepareforsgue(segue:UIStoryboardSegue,sender:AnyObject?{if(segue.identifier==“showFront”){var:CardFrontViewController=segue.destinationViewController as!CardFrontViewController let indexath=menuTable.indexPathForSelectedRow()!let titleString=menuItems[indexPath.row]。name.titleStringViaSegue=titleString self.menuTable.deselerowatinexpath(indexPath,动画:true)}'我删除了我的IBOutlet并改为使用self.tableView。但我收到了相同的错误…'重写func prepareForSegue(segue:UIStoryboardSegue,sender:AnyObject?{if(segue.identifier==“showFront”){var:CardFrontViewController=segue.destinationViewController as!CardFrontViewController让indexPath=self.tableView.indexPathForSelectedRow()!让titleString=menuItems[indexPath.row].name.titleStringViaSegue=titleStringSelf.tableView.DeceloseRowatingIndexPath(indexPath,动画:true)}}}}我删除了我的IBOutlet并改用了self.tableView。但我收到了相同的错误…'override func prepareforsgue(segue:UIStoryboardSegue,发送方:AnyObject?{if(segue.identifier==“showFront”){var:CardFrontViewController=segue.destinationViewController as!CardFrontViewController let indexath=self.tableView.indexPathForSelectedRow()!let titleString
 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)

        }
    }