Swift PrepareForSegue NSIndexPath错误

时间:2015-09-21 06:23:40

标签: ios swift uitableview segue swift2

我想通过以下方式准备我的segue:

override func prepareForSegue(segue: UIStoryboardSegue?, sender: AnyObject?) {
    if segue?.identifier != "fromOpenChatsToLogIn" {
        if let controller: ChatViewController? = segue?.destinationViewController as? ChatViewController {
            if let cell: onlineUserCell? = sender as? onlineUserCell {
                let user = OneRoster.userFromRosterAtIndexPath(indexPath: tableView.indexPathForCell(cell!)!)
                controller!.recipient = user
            }
        }
    }
}

其中onlineUserCell是我的自定义单元格。另外,这是我的userFromRosterAtIndexPath:

class func userFromRosterAtIndexPath(indexPath indexPath: NSIndexPath) -> XMPPUserCoreDataStorageObject {
    return sharedInstance.fetchedResultsController()!.objectAtIndexPath(indexPath) as! XMPPUserCoreDataStorageObject
}

所以,当我选择我的手机时,它崩溃了:

fatal error: unexpectedly found nil while unwrapping an Optional value

在线:

let user = OneRoster.userFromRosterAtIndexPath(indexPath: tableView.indexPathForCell(cell!)!)

有什么问题?我该如何解决?

4 个答案:

答案 0 :(得分:2)

首先,Swift引入了类型推断,最佳实践是正确使用它,所以编写这样的代码

if let controller = segue?.destinationViewController as? ChatViewController {
   if let cell = sender as? onlineUserCell {
   }
}

此外,您应该在Xcode(here)中设置一个异常断点,以便更清楚地看到您崩溃的位置。

在你的情况下,它在

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?)

您应该使用以下声明:

if segue.identifier == "fromOpenChatsToLogIn" {
} else {
}

您的登录ViewController不需要用户,因此它在

处崩溃
let user = OneRoster.userFromRosterAtIndexPath(indexPath: tableView.indexPathForCell(cell)!)

因为没有cellsender中的prepareForSegue绝对不是一个单元格。

对于第二个问题,修复很简单。

您正在

中发送OneRoster.userFromRosterAtIndexPath(indexPath: indexPath)
performSegueWithIdentifier("fromUsersListToChatView", sender: OneRoster.userFromRosterAtIndexPath(indexPath: indexPath))

因为你已经拥有user对象,所以你不需要一个单元格或任何东西!

像这样设置recipient

controller?.recipient = sender as? XMPPUserCoreDataStorageObject

只需将您的prepareForSegue方法替换为以下内容即可:

if segue.identifier == "fromOpenChatsToLogIn" {
} else {
    let controller = segue.destinationViewController as? ChatViewController         
    controller?.recipient = sender as? XMPPUserCoreDataStorageObject
}

答案 1 :(得分:0)

只需检查您的cellnil还是userFromRosterAtIndexPath返回nil

答案 2 :(得分:0)

我的建议是在每个单元格上设置标记,然后在prepareForSegue方法中,获取单元格,获取标记,然后调整userFromRosterAtIndexPath的代码来取代该标记。该标记值可以是单元格的行号。看看这在你的背景下是否有意义。

答案 3 :(得分:0)

像这样检查投射。

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "PhotoScrollerViewController" {
        if let controller = segue.destinationViewController as? PhotoScrollerViewController {
            var cell:UICollectionViewCell = (sender as? UICollectionViewCell)!

           //Code here
        }
    }
}