prepareForSegue崩溃应用程序

时间:2015-07-01 01:37:33

标签: ios swift segue

所以我的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]
    }
}

}

3 个答案:

答案 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导致崩溃。