在 swiftUI 中加载图像在展开时导致 nil
Posted
技术标签:
【中文标题】在 swiftUI 中加载图像在展开时导致 nil【英文标题】:loading image in swiftUI causing nil while unwrapping 【发布时间】:2020-05-21 15:56:26 【问题描述】:我收到以下错误:
Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value
在我的ProfileView()
中使用import URLImage
库。
URLImage(URL(string: self.profileViewModel.profileURL)!, placeholder: Image(systemName: "circle"),
content:
$0.image
.resizable()
.aspectRatio(contentMode: .fill)
.frame(width: 130, height: 130)
.cornerRadius(15)
.overlay(
Image(systemName: "plus.circle.fill")
.foregroundColor(.gray)
.font(.largeTitle)
,alignment: .bottomTrailing)
.onTapGesture
self.profileViewModel.showImagePicker = true
)
在我的ProfileView()
我使用.onAppear(perform: loadUserData)
这很好用,为用户带回正确的数据并按预期显示。
func LoadAUser(userId: String)
Firestore.firestore().collection("users").document(userId).getDocument(snapshot, error) in
guard let snap = snapshot else
print("error fetching data")
return
let dict = snap.data()
guard let decodedUser = try? User.init(fromDictionary: dict!) else return
print("decoded user - load user - \(decodedUser)")
self.bio = decodedUser.bio
self.occupation = decodedUser.occupation
self.city = decodedUser.city
self.profileURL = decodedUser.profileURL
let storageRoot = Storage.storage().reference(forURL: "gs://myapp.appspot.com").child("avatar").child(userId)
storageRoot.downloadURL(url, error) in
if error != nil
print(error!.localizedDescription)
return
let profileDownload = url?.absoluteString
self.profileURL = profileDownload!
print("profileURL - \(self.profileURL)")
存储有一个图像,我可以检索它,因为日志显示print("profileURL - \(self.profileURL)")
这里一切都很好
我似乎无法在ProfileView()
中显示个人资料图片
该函数在配置文件视图中调用,就像在 .onAppear 中一样
func loadUserData()
DispatchQueue.main.asyncAfter(deadline: .now() + 10)
self.profileViewModel.LoadAUser(userId: Auth.auth().currentUser!.uid)
我曾尝试添加延迟:
DispatchQueue.main.asyncAfter(deadline: .now() + 10)
只是图像无法加载,我不确定为什么在加载其他所有内容时它会显示 found nil
但是当我添加此 URLImage 以恢复图像时它显示为零,即使日志显示它具有正确的网址。
更新
我有一个class ProfileViewModel: ObservableObject
有
@Published var profileURL: String = ""
在 loadAUser 函数中。我设置了:
self.profileURL = profileDownload!
【问题讨论】:
这样做***.com/help/minimal-reproducible-example 我们可以帮助你,否则我们只能猜测...... 【参考方案1】:我在您发布的代码中看不到错误,但有些内容您没有发布关于您的课程:
您似乎有一个类(profileViewModel),您必须在其中将图像保存到一个变量,该变量位于类的顶部,声明如下:@Published var image ...
如果您说您能够使用.onAppear(perform: loadUserData)
检索您需要的所有数据(包括图像),那么您只需在将图像提取到 ViewModel 中后将其保存到变量中,并且所有视图都可以访问 @ 987654323@可以访问profileViewModel.image
。
【讨论】:
【参考方案2】:解决方法,我从 sessionStore 获得了价值
URLImage(URL(string: self.session.userInSession!.profileURL)!,
【讨论】:
以上是关于在 swiftUI 中加载图像在展开时导致 nil的主要内容,如果未能解决你的问题,请参考以下文章
URLImage 从不在 SwiftUI 的小部件应用程序中加载图像 [重复]
如何在Android中加载带有动画的cardview GridView?