Использование пакета swift URLImage с объектами nil - PullRequest
0 голосов
/ 16 июня 2020

Я использую API новостей для получения новостных статей, однако иногда imageURL равен нулю. Когда это происходит, пакет URLImage не может загрузить соответствующее изображение, и ничего из приложения не загружается. отсутствует.

OR

Не загружать в строке списка полностью, если он не соответствует определенным критериям, таким как наличие нулевого значения для imageURL

Выше код, который загружается в представление.

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

Приносим извинения за неудобства, так как это мой первый проект.

1 Ответ

0 голосов
/ 19 июня 2020

FYI, я решил проблему, переместив код 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()
    }
}

Надеюсь, это поможет любому, у кого есть подобная проблема.

...