意外发现 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)
我正在尝试向我的群聊应用程序添加一项功能,如果点击头像,您将被带到包含该用户信息的个人资料页面。我正在使用的框架 (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)