在我向UITableView添加了额外的segue之后发生了这个错误。因此,不是将segue从tableViewCell传递到我的UIViewController,它现在来自UITableViewController到2个不同的UIViewControllers。
我为segu showVerse
和showAbout
设置了唯一标识符。
我的UITableView中的代码如下所示:
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
if ( indexPath.section == 4 ) {
performSegueWithIdentifier("showAbout", sender: self)
} else {
performSegueWithIdentifier("showVerse", sender: self)
}
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "showVerse" {
let pageDetailViewController = segue.destinationViewController as! PageViewController
// Get the cell that generated this segue.
if let selectedCell = sender as? PageTableViewCell {
// ^~~~~~ This line loads my PageViewController for some reason
// Then my PageViewController fails because it doesn't have a `.page`
let indexPath = tableView.indexPathForCell(selectedCell)!
let verse = self.items[indexPath.section][indexPath.row].verse
for page in pages {
if page.valueForKey("chapter") as! Int == indexPath.section + 1 && page.valueForKey("verse") as! Int == verse {
pageDetailViewController.page = page
// ^~~~~ If it could get to this line, then it would have loaded correctly.
}
}
}
} else {
segue.destinationViewController as! AboutController
}
}
当我的indexPath.section
为0 - 3时,它会在分配.page
之前加载我的PageViewController。
当我的segue从UITableViewCell到UIViewController时,我没有遇到这个问题。它似乎等待我的所有代码行运行。然后它会知道我的.page
何时被设置。
答案 0 :(得分:1)
您的didSelectRowAtIndexPath:
方法正在将self
sender
参数发送给performSegueWithIdentifier:
,但您尝试将sender
投射为PageTableViewCell
在prepareForSegue:
中将失败,因为sender
是一个视图控制器。
执行segue时,您应该将单元格作为sender
发送。
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
if ( indexPath.section == 4 ) {
performSegueWithIdentifier("showAbout", sender: tableView.cellForRowAtIndexPath(indexPath))
} else {
performSegueWithIdentifier("showVerse", sender: tableView.cellForRowAtIndexPath(indexPath))
}
}
答案 1 :(得分:1)
我不认为发送者应该在你的performSegueWithIdentifier方法中自我。
我会沿着这些方向做点什么:
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
let cell = tableView.cellForRowAtIndexPath(indexPath)
if ( indexPath.section == 4 ) {
performSegueWithIdentifier("showAbout", sender: cell)
} else {
performSegueWithIdentifier("showVerse", sender: cell)
}
}