首页 > 解决方案 > 使用带有 nil 对象的 swift URLImage 包

问题描述

我正在使用新闻 API 来检索新闻文章,但有时 imageURL 为 nil。发生这种情况时,URLImage 包无法加载到相关图像中,并且应用程序上的任何内容都不会加载。

如果 imageURL 不存在,有人可以告诉我如何使用某种选项来获得默认图像。

或者

如果它不符合某些条件(例如 imageURL 的值为 nil),则不完全加载到列表的行中

以上是在视图中加载的代码。

var body: some View {
    NavigationView {
        // for every single post in the post array
        List(networkManager.posts) { post in
            NavigationLink(destination: DetailView(url: post.url)) {
                VStack {
                    Text(post.title)
                        .bold()
                    HStack {
                        Text(post.description ?? "No description provided.")
                            .padding(.top)
                        // Check the url of the image
                        URLImage(URL(string: post.urlToImage)!) { proxy in
                            proxy.image
                                .resizable()
                                .aspectRatio(contentMode: .fit)
                        }
                        .frame(width:150)
                    }
                }
            }
        }
        .navigationBarTitle("Science Bite")
    }
        // This calls fetch data
        .onAppear {
            self.networkManager.fetchData()
    }
}

此外,如果您需要查看更多我的代码来解决问题,这里是我的 GitHub 存储库的链接。Github 链接

非常抱歉给您带来不便,因为这是我的第一个项目。

标签: jsonswiftnetworking

解决方案


仅供参考,我通过将 UIImage 代码移动到另一个结构中(可选地)另一个文件来解决了这个问题。然后,我为 urlToImage 的未包装选项字符串添加了一个初始化程序,并通过使用可选绑定为非可选的新字符串添加了一个计算属性。

这是代码:

struct URLImageView: View {

let badURL: String?

var imgURL: String {
    if let safeURL = badURL {
        return safeURL
    } else {
        return "https://thumbs-prod.si-cdn.com/s-jZTk0XtVmp-89MlOgFXqaAVe4=/fit-in/1600x0/https://public-media.si-cdn.com/filer/29/0f/290fb8c0-1872-46e5-8c12-235742905def/science_smithsonian_magazine_booklist_2019.png"
    }
}

var body: some View {
    URLImage(URL(string: imgURL)!) { proxy in
        proxy.image
            .resizable()
            .aspectRatio(contentMode: .fit)
    }
    .frame(width: 150)
}

然后我使用以下代码将此结构添加到我的主要内容视图中:

struct ContentView: View {

@ObservedObject var networkManager = NetworkManager()

var body: some View {
    NavigationView {
        // for every single post in the post array
        List(networkManager.posts) { post in
            NavigationLink(destination: DetailView(url: post.url)) {
                VStack {
                    Text(post.title)
                        .bold()
                    HStack {
                        Text(post.description ?? "No description provided")
                            .padding(.top)
                        // Check the url of the image
                        URLImageView(badURL: post.urlToImage)
                    }
                }
            }
        }
        .navigationBarTitle("Science Bite")
    }
        // This calls fetch data
        .onAppear {
            self.networkManager.fetchData()
    }
}

希望这将帮助任何有类似问题的人。


推荐阅读