ios - Swift PrepareForSegue NSIndexPath 错误

标签 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!)!)

怎么了?我该如何解决?

最佳答案

首先,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)!)

因为没有cellprepareForSegue中的sender绝对不是cell。

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

您正在发送 OneRoster.userFromRosterAtIndexPath(indexPath: indexPath)

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

所以您不需要单元格或任何东西,因为您已经有了 user 对象!

像这样设置收件人:

controller?.recipient = sender as? XMPPUserCoreDataStorageObject

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

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

关于ios - Swift PrepareForSegue NSIndexPath 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32688602/

相关文章:

ios - 如何避免插入重复记录?

ios - 通过KVO观察数据库值的变化

swift - Swift 中的错误 "Trailing closure passed to parameter of type ' NSManagedObjectContext' 不接受闭包

ios - 遗留单元格布局?

ios - 使用 iOS 的 UITableView,如果单元格在图像下载到其中之前已经出队怎么办?

ios - 退出应用程序时无法使用 NSUserDefaults 保存整数

ios - 存档应用程序 RestKit 0.10 失败

ios - 访问所有firebase用户的信息

ios - Storyboard View (iphone 4/5/6)影响集合单元格大小的布局(以编程方式设置)

iOS 10 自定义单元格颜色 alpha 被忽略