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



我在行中遇到错误:CCD_ 1。似乎我没有从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)
        }
    }
}

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

我不知道这是否是问题所在,但如果你需要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)
        }
    }

我看到您使用的是UITableViewController。在UITableViewController中,会自动为您创建一个具有所需插座的UITableView。您可以通过let indexPath = self.menuTable.indexPathForSelectedRow()!0以代码形式访问它。我的猜测是,您没有为名为menuTableUITableView连接IBOutlet。因此,展开时为零的可选不是indexPath,而是UITableView

修复:删除IBOutlet和所有使用menuTable变量的地方,改为使用self.tableView

相关内容

  • 没有找到相关文章

最新更新