2015-11-06 54 views
1

我收到错误消息: let indexPath = self.menuTable.indexPathForSelectedRow()!。 似乎我没有从indexPathForSelectedRow获得价值。我从CSV文件解析到Core Data。不知道它是否重要。我是编码新手,所以不确定我是否缺少明显的东西。致命错误:在解包可选值时意外发现零:Swift,核心数据

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) 

     } 
    } 

} 
+0

你的故事板中的单元格是否与segue相连? –

+0

是的,我将单元连接到故事板segue,“显示(例如Push)”,标识符为“showFront”。 – Sara

回答

0

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

+0

谢谢,谢谢,谢谢!我删除了tableView:didSelectRowAtIndexPath:按照你的建议和它的工作! – Sara

+0

@Sara很高兴能工作。如果解决了您的问题,您可以考虑将答案标记为正确。 –

0

我不知道这是不是问题,但为什么你用自己作为发件人,如果你需要indexPath?

尝试:

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) 

     } 
    } 
+0

如果我不使用自己作为发件人,会有什么替代方法?我是新来的。我认为这是最好的方式?... – Sara

+0

我掏出自己,但我仍然得到相同的错误... – Sara

+0

'重写func prepareForSegue(segue:UIStoryboardSegue,sender:AnyObject?) { if( segue.identifier ==“showFront”) { var即将推出:CardFrontViewController = segue.destinationViewController as! CardFrontViewController let indexPath = menuTable.indexPathForSelectedRow()! 让titleString =的菜单项[indexPath.row]。名称 upcoming.titleStringViaSegue = titleString self.menuTable.deselectRowAtIndexPath(indexPath,动画:真) } } ' – Sara

0

我看你使用的是UITableViewController。在UITableViewController中,UITableView会自动为您提供所需的插座。您可以通过代码self.tableView访问它。我的猜测是,你没有连接IBOutlet你的UITableViewmenuTable。所以在展开时为零的可选项不是indexPath而是UITableView

修复: 删除您IBOutlet到处都使用menuTable变量和使用self.tableView代替。

+0

我删除我的IBOutlet中并用于自我。改为tableView。但我收到了同样的错误...... – Sara

+0

“覆盖FUNC prepareForSegue(SEGUE:UIStoryboardSegue,发件人:AnyObject) { 如果(segue.identifier == ”showFront“) {VAR 即将到来:CardFrontViewController = segue.destinationViewController为!CardFrontViewController let indexPath = self.tableView.indexPathForSelectedRow()! 让titleString =的菜单项[indexPath.row]。名称 upcoming.titleStringViaSegue = titleString self.tableView.deselectRowAtIndexPath(indexPath,动画:真) } } } ' – Sara

相关问题