我收到错误:
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)
}
}
}
答案 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
。在UITableViewController
中UITableView
会自动为您创建所需的插座。您可以通过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;
}
。