意外发现 nil 错误,但所有值都存在

Getting unexpectedly found nil error, but all values are there

我正在尝试向我的群聊应用程序添加一项功能,如果点击头像,您将被带到包含该用户信息的个人资料页面。我正在使用的框架 (JSQMesssagesViewController) 有一个用于点击头像的内置方法,didTapAvatarImageView

override func collectionView(_ collectionView: JSQMessagesCollectionView!, didTapAvatarImageView avatarImageView: UIImageView!, at indexPath: IndexPath!) {

    let message = messages[indexPath.item]

    DispatchQueue.main.async {
        let profileVC = ProfileViewController()
        let name = message.senderDisplayName ?? ""
        let gender = self.genderDictionary.value(forKey: message.senderId) as? String ?? ""
        let status = self.statusDictionary.value(forKey: message.senderId) as? String ?? ""
        let avatarString = self.avatarDictionary.value(forKey: message.senderId) as? String ?? ""

        print("\n\nsegueTest: name: \(name), gender: \(gender), avatar: \(avatarString), status: \(status)\n\n")

        profileVC.profileImageView.loadImageUsingCacheWithUrlString(avatarString)
        profileVC.nameLabel.text = name

        switch gender {
        case "male":
            profileVC.nameLabel.textColor = UIColor(hexString: "8097E1")
        case "female":
            profileVC.nameLabel.textColor = UIColor(hexString: "E98BD5")
        default:
            profileVC.nameLabel.textColor = UIColor(hexString: "4F4F4F")
        }

        switch status {
        case "2FCB78":
            profileVC.profileGoingOutLabel.text = "\(name) wants to go out tonight!"
        case "E13F34":
            profileVC.profileGoingOutLabel.text = "\(name) is staying in tonight."
        default:
            profileVC.profileGoingOutLabel.text = "\(name) might want to go out tonight - let them know what the plans are!"
        }

        self.performSegue(withIdentifier: "chatToProfile", sender: self)
    }
}

当我点击头像时,意外发现 nil 崩溃 - 但我的打印语句打印值没有问题,所以它们确实存在。我不确定我哪里出错了,因为 Xcode 没有告诉我 nil 中的哪个值,正如我所说的,我试图传递的值确实存在。

我该怎么做才能解决这个错误?

您需要为通过 profileVC 中的先前视图控制器显示的所有标签声明字符串 属性。

var strName : String

在viewDidLoad中

nameLabel.text = strName

上一个viewcontroller

profileVC.strName = yourstring

如果使用 prepareForSegue 那么你需要在这个方法中传递数据而不是 didSelect。

如果你想在不使用 prepareForSegue 的情况下在 didSelect 上传递数据,那么你需要创建 viewcontroller 的实例,如下所示。

修改以下代码仅供说明

let profileVC = self.storyboard.initiatedwithidentifier: "yourViewcontrollerIdentifier"
profileVC.strName = yourString
self.navigationviewcontroller(profileVc, animated : true)