我想通过以下方式准备我的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!)!)
有什么问题?我该如何解决?
答案 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)!)
因为没有cell
,sender
中的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)
只需检查您的cell
是nil
还是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
}
}
}