@ObservedObjectの使用で上手くbindingができません。
nilの原因がわからないのでその理由と対処法を教えていただきたいです。
よろしくお願いします。
下記のコードの
Text(viewModel.imageUrl!) ```でエラーがでます [view] ```ここに言語を入力 import SwiftUI import SDWebImageSwiftUI struct CheckListHeaderView: View { @ObservedObject var viewModel = CheckListViewModel() var body: some View { VStack { //Text("aaaaaaaaa") //ここでFatal error: Unexpectedly found nil // while unwrapping an Optional value: file Text(viewModel.imageUrl!) } } }
【viewModel(のつもり)】
import UIKit import Firebase import SwiftUI import Combine class CheckListViewModel:ObservableObject { @Published var imageUrl:String! @Published var requestedProduct = [RequestedProduct]() init() { setdata() } func setdata() { CheckListService.getAcceptedRequest { request in guard let fromUserId = request.fromUserId else { return } Database.fetchUser(with:fromUserId) { user in self.imageUrl = user.profileImageURL! print("CheckListViewModel:(self.imageUrl!)") } self.requestedProduct = request.products } } }
上記コード内の関数(オレ俺コードでわかりにくいですが。。。)
import Foundation import Firebase import MapKit class CheckListService { static func getAcceptedRequest(completion:@escaping(CheckList) ->() ) { guard let currentUid = Auth.auth().currentUser?.uid else { return } GET_REQUEST_USER_REF.child(currentUid).observeSingleEvent(of: .value) { (snapshot) in guard let allObjects = snapshot.children.allObjects as? [DataSnapshot] else { return } allObjects.forEach { (snapshot) in let requestId = snapshot.key REQUEST_REF.child(requestId).observeSingleEvent(of: .value) { (snapshot) in guard let dictionary = snapshot.value as? Dictionary<String,AnyObject> else { return } // guard let alreadyAccepted = dictionary["isAccepted"] as? Bool else { return } if alreadyAccepted { let requestData = CheckList(dictionary: dictionary) REQUEST_REF.child(requestId).child("products").observeSingleEvent(of: .value) { (snapshot) in guard let allObjects = snapshot.children.allObjects as? [DataSnapshot] else { return } allObjects.forEach { (snapshot) in let requestProductId = snapshot.key guard let dictionary = snapshot.value as? Dictionary<String,AnyObject> else { return } let requestedProduct = RequestedProduct(id: requestProductId, dictionary: dictionary) requestData.products.append(requestedProduct) completion(requestData) } } } } } } } }
一番初めのCheckListHeaderViewクラスの
VStack { //Text("aaaaaaaaa") //ここでFatal error: Unexpectedly found nil //while unwrapping an Optional value: file Text(viewModel.imageUrl!) }
を
VStack { Text("aaaaaaaaa") }
にすると下記のコメント部分でしっかりuserデータは取れています(printが表示される)
class CheckListViewModel:ObservableObject { @Published var imageUrl:String! @Published var requestedProduct = [RequestedProduct]() init() { setdata() } func setdata() { CheckListService.getAcceptedRequest { request in guard let fromUserId = request.fromUserId else { return } Database.fetchUser(with:fromUserId) { user in self.imageUrl = user.profileImageURL! //ここでしっかりuser情報は取れている print("CheckListViewModel:(self.imageUrl!)") } self.requestedProduct = request.products } } }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/08/28 11:30