将数据传递到使用 Prepareforsegue 找到的 segued 控制器 nil



我有以下课程

class FriendsProfileViewController: UIViewController {
    var user : User!
    override func viewDidLoad() {
        super.viewDidLoad()
        print(user.firstName)
    }
}

在 segueing 类上,我做了以下操作来传递数据

var friends: [User]?
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    performSegueWithIdentifier("viewFriend", sender: indexPath)
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    let destinationVC = segue.destinationViewController
    if let friendsProfileVC = destinationVC as? FriendsProfileViewController{
        if let indexPath = sender as? NSIndexPath{
            print(indexPath.row)
            friendsProfileVC.user = friends?[indexPath.row]
        }
    }
}

为什么我收到错误

致命错误:解开可选值时意外发现 nil

即使我的friend?[indexPath.row]在我 segue 时被验证包含值?。

尝试在执行 segue 之前获取用户,并将其作为 segue 发送者传递。

var friends: [User]?
private func friend(at index: Int) -> User? {
    return friends.flatMap { $0.indicies.contains(index) ? $0[index] : nil }
}
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    if let friend = friend(at: indexPath.row) {
        performSegueWithIdentifier("viewFriend", sender: friend)
    } else {
        print("Invalid index: (indexPath.row)")
    }
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    switch (segue.destinationViewController, sender) {
    case (let controller as FriendsProfileViewController, let user as User):
        controller.user = user
    default:
        break
    }
}
我相信

的问题是我们总是从数组中返回一个 Optional friends![indexPath.row]返回一个Optional(User)

我最终将可选用户作为发件人传递。解开包装并将其设置为我的另一个VC。

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    performSegueWithIdentifier("viewFriend", sender: friends![indexPath.row])
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    print(sender)
    let destinationVC = segue.destinationViewController
    if let friendsProfileVC = destinationVC as? FriendsProfileViewController{
        if let friend = sender as? User{
            print(friend)
            print(friend.firstName)
            friendsProfileVC.user = friend
        }
    }
}

更新,我尝试将friendsProfileVC.user = friends?[indexPath.row]更改为friendsProfileVC.user = friends![indexPath.row]并且有效。不知道为什么它早些时候不起作用。

最新更新