- Swift3.0を使用しています
- プログラミング初心者です
Firebase内のストレージ画像を呼び出し、KingfisherでUIImageに変換する
以下コードです。若干冗長な感じになってますがとりあえずコードが通ったら集約する予定です。
- 画像を呼び出す部分
ChatViewController.swift
class ChatViewController: JSQMessagesViewController {
var sendText:String = "" //チャット相手のuidが入ってくる
var recieverId:String!
var userId : String!
var nickName : String!
var roomKey : String!
var messages = [JSQMessage]()
var senderProfileImage : UIImageView!
var senderProfileImageInChat : JSQMessagesAvatarImage!
var senderProfileImageUrl : String!
var recieverProfileImage : UIImageView!
var recieverProfileImageInChat : JSQMessagesAvatarImage!
var recieverProfileImageUrl : String!
var item = [NSDictionary]()
//自分のプロファイルイメージのURLを呼び出す
func getSenderProfileImage(uid :String!, completion:@escaping (_ imageUrl: String) -> Void){
let urlData: String = "profile/" + uid + ".jpg"
let storage = Storage.storage()
let storageRef = storage.reference(forURL: " *firebaseUrl* ")
storageRef.child(urlData).downloadURL { (URL, error) -> Void in
guard let urlString = URL?.absoluteString else {
return
}
// self.recieverProfileImageUrl = urlString
completion(urlString)
}
}
- viewDidLoadの部分
ChatViewController.swift
override func viewDidLoad() {
super.viewDidLoad()
self.topContentAdditionalInset = 30
recieverId = sendText
let ref = Database.database().reference()
userId = Auth.auth().currentUser?.uid
self.senderDisplayName = ""
senderId = userId
//nicknamesを取得
ref.child("profile").child(userId!).observeSingleEvent(of: .value, with: { (snapshot) in
let value = snapshot.value as? NSDictionary
self.senderDisplayName = value?["nickname"] as? String ?? ""
self.nickName = self.senderDisplayName
}) { (error) in
print(error.localizedDescription)
}
//タイトルをセット(本当は相手の名前にしたい)
self.title = "メッセージ"
//自分のプロファイルイメージをセット
getSenderProfileImage(uid: senderId) { (imageUrl) in
let i = (imageUrl)
//var url: URL = URL(string: i)!
if let url :URL = URL(string: i) {
self.recieverProfileImage!.kf.setImage(with: url)
}
let profileImage = self.recieverProfileImage.image
self.recieverProfileImageInChat = JSQMessagesAvatarImageFactory.avatarImage(with: profileImage, diameter: 64)
self.collectionView.reloadData()
}
これでコンパイルエラーはなさそうなのですが、
この self.recieverProfileImage!.kf.setImage(with: url) でビルド時にクラッシュします。
この部分で po self.recieverProfileImage!.kf.setImage(with: url) をすると以下のエラーが返却されます。
fatal error: unexpectedly found nil while unwrapping an Optional value
error: Execution was interrupted, reason: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0).
The process has been returned to the state before expression evaluation.
この原因がわからず、困っています。
アドバイスいただけるとありがたいです。解決した場合にこちらで記載します。