所以我的segue在这里崩溃,我不知道为什么......没有显示错误,但是当我在模拟器中运行应用程序然后按下按钮以使其在调试器中发生此错误时崩溃:无法铸造类型' DNApp.StoriesTableViewController' (0x1077d5a80)到' UITableViewCell' (0x109d8ca18)。 (lldb)
以下是相关代码:
class StoriesTableViewController: UITableViewController, StoryTableViewCellDelegate {
override func viewDidLoad() {
super.viewDidLoad()
tableView.estimatedRowHeight = 100
tableView.rowHeight = UITableViewAutomaticDimension
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return data.count
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("StoryCell") as! StoryTableViewCell
let story = data[indexPath.row]
cell.configureWithStory(story)
cell.delegate = self
return cell
}
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
performSegueWithIdentifier("WebSegue", sender: self)
tableView.deselectRowAtIndexPath(indexPath, animated: true)
}
// MARK: StoryTableViewCellDelegate
func storyTableViewCellDidTouchUpvote(cell: StoryTableViewCell, sender: AnyObject) {
// TODO: Implement Upvote
}
func storyTableViewCellDidTouchComment(cell: StoryTableViewCell, sender: AnyObject) {
performSegueWithIdentifier("CommentsSegue", sender: self)
}
//MARK: Misc
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "CommentsSegue" {
let toView = segue.destinationViewController as! CommentsTableViewController
let indexPath = tableView.indexPathForCell(sender as! UITableViewCell)!
toView.story = data[indexPath.row]
}
}
}
答案 0 :(得分:1)
抱歉,我完全误解了你的问题!你的崩溃仍然是由于力量展开造成的。您应该使用可选绑定(if let
)。您可以一次执行多个绑定,并使用where
子句使代码更清晰:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if let toView = segue.destinationViewController as? CommentsTableViewController where segue.identifier == "CommentsSegue" {
if let cell = sender as? UITableViewCell,
let indexPath = tableView.indexPathForCell( cell ) {
toView.story = data[indexPath.row]
}
}
}
答案 1 :(得分:1)
这是因为您的手机不是UITableViewCell
而是StoryTableViewCell
。如果您使用if let
而不是强制换行,您会看到您的应用不会崩溃,但是您无法访问单元格中的值,您只需要正确投射单元格,如下所示:
class StoriesTableViewController: UITableViewController, StoryTableViewCellDelegate {
var myIndexPat = NSIndexPath()
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
myIndexPath = indexPath
performSegueWithIdentifier("WebSegue", sender: self)
tableView.deselectRowAtIndexPath(indexPath, animated: true)
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "CommentsSegue" {
let toView = segue.destinationViewController as! CommentsTableViewController
let indexPath = tableView.indexPathForCell(myIndexPath) as! StoryTableViewCell
toView.story = data[indexPath.row]
}
}
答案 2 :(得分:0)
func storyTableViewCellDidTouchComment(cell: StoryTableViewCell, sender: AnyObject) {
performSegueWithIdentifier("CommentsSegue", sender: self)
}
在prepareForSegue方法中,sender是一种StoriesTableViewController类,强制转换为UITableViewCell导致崩溃。