在 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 的小部件应用程序中加载图像 [重复]

无法在 tvOS 应用程序中加载 LCR 图像

如何在Android中加载带有动画的cardview GridView?

Swift 中的 UIView 子类:IBOutlet 在展开时发现为零

ExtJS可折叠面板在展开时不呈现工具栏?

为啥核心数据不会在 swiftui 类中加载,但会在结构视图中加载