【问题标题】:Pass data to segued controller found nil using Prepareforsegue使用 Prepareforsegue 将数据传递给发现 nil 的 segued 控制器
【发布时间】:2017-02-02 17:05:46
【问题描述】:

我正在学习以下课程。

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] 在我转场时被验证包含一个值?。

【问题讨论】:

  • 你调试了吗?如果是,发生了什么?
  • 在哪一行你正面临给定代码的崩溃??并且您的已初始化或为空??
  • 您是否获得了print(indexPath.row) 行的控制台输出?
  • 这意味着您正在传递用户的 nil 值。你应该取 User 的可选值,或者你应该确保你没有传递 nil 值。
  • 检查friends是否为nil

标签: ios swift


【解决方案1】:

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

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
    }
}

【讨论】:

    【解决方案2】:

    我认为问题是我们总是从数组中返回一个 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] 并且成功了。不知道为什么它之前没有工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-26
      • 2014-12-08
      • 2017-02-14
      • 2017-09-20
      • 2016-04-06
      • 1970-01-01
      • 2017-02-18
      • 2015-12-12
      相关资源
      最近更新 更多