致命错误:在展开可选值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)
}
}