Передать детали объекта в другое представление [SwiftUI] - PullRequest
0 голосов
/ 26 апреля 2020

Столкнувшись с проблемой, чтобы понять, как переместить детали объекта в другое представление с помощью NavigationLink, я прочитал много статей и просмотрел видео, все они делают то же самое, что и я, за исключением структуры Preview, они используют локальные данные и легко сопоставляют просмотр первого элемента данных, таких как data [0]. Хотя в моем случае я получаю данные онлайн, следовательно, описанный выше способ не помог мне преодолеть проблему с помощью структуры Preview, ОШИБКА: отсутствует аргумент для параметра

Статьи были прочитаны: developer.apple.com / учебные пособия / swiftui / строительные списки и навигация

www.raywenderlich.com/5824937-swiftui-tutorial-navigation

www.youtube.com/watch?v=BCSP_uh0co0&ab_channel=azamsharp

/// Код основного вида:

    import SwiftUI
    import SDWebImageSwiftUI

    struct HomeView: View {
        @State var posts: [Posts] = []
        @State var intPageNo: Int = 0
        var body: some View {
            NavigationView {
                List(posts) {post in
                    NavigationLink(destination: ViewPostView(post: post)){
                        VStack{
                            HStack{
                                WebImage(url: URL(string: post.featured_image))
                                    .resizable()
                                    .placeholder(Image("logo"))
                                    .frame(width: 150, height: 150, alignment: .center)

                                VStack(alignment: .leading, spacing: 10.0){
                                    Text("By: \(post.author_name)")
                                    Text("Since: \(post.since)")
                                    Text("City: \(post.city_name)")
                                    Text("Category: \(post.category_name)")

                                }
                                .font(.footnote)

                                Spacer()
                            }

                            Text(post.title)
                                .font(.body)
                                .fontWeight(.bold)
                                .frame(alignment: .trailing)
                                .flipsForRightToLeftLayoutDirection(true)
                        }
                    }

                }
                .onAppear{
                    self.intPageNo += 1
                    ApiPosts().getPosts(intPage: self.intPageNo){(posts) in
                        self.posts = posts
                    }
                }

                .navigationBarTitle(Text("Home"))
            }

        }
    }

    struct HomeView_Previews: PreviewProvider {
        static var previews: some View {
            HomeView()
        }
    }

/// Детальный вид кода:

    import SwiftUI

    struct ViewPostView: View {

        @State var comments: [Comments] = []
        @State var post: Posts

        var body: some View {
            NavigationView {
                VStack{
                    Text(post.post_content)
                        .frame(alignment: .trailing)
                    List(comments){comment in
                        VStack(alignment: .trailing, spacing: 10){
                            HStack(spacing: 40){
                                Text(comment.author_name)
                                Text(comment.comment_date)
                            }

                            Text(comment.comment_content)
                        }
                    }
                    .frame(alignment: .trailing)
                    .onAppear {

                        PostViewManager().getComments(intPostID: self.post.id){(comments) in
                            self.comments = comments
                        }
                    }
                }

            }
        }
    }

    struct ViewPostView_Previews: PreviewProvider {
        static var previews: some View {

            ViewPostView()
        }
    }

/// Извлечение данных кода:

    struct Comments: Codable, Identifiable {
        var id: Int
        var author_name: String
        var comment_content: String
        var comment_date: String
        var comment_date_gmt: String
        var approved: String
    }

    class PostViewManager {


        func getComments(intPostID: Int, completion: @escaping ([Comments]) -> ()){

            guard let url = URL(string: "https://test.matjri.com/wp-json/matjri/v1/comments/\(intPostID)") else {return}

            URLSession.shared.dataTask(with: url) { (data, _, _) in
                let comments = try! JSONDecoder().decode([Comments].self, from: data!)
                DispatchQueue.main.async {
                    completion(comments)
                }
            }
            .resume()
        }

    }

    struct Posts: Codable, Identifiable {
        var id: Int
        var title: String
        var city_id: Int
        var city_name: String
        var category_id: Int
        var category_name: String
        var since: String
        var author_id: String
        var author_name: String
        var post_content: String
        var featured_image: String
    }

    class ApiPosts {

        func getPosts(intPage: Int, completion: @escaping ([Posts]) -> ()){
            guard let url = URL(string: "https://test.matjri.com/wp-json/matjri/v1/posts/0") else {return}

            URLSession.shared.dataTask(with: url) { (data, _, _) in
                let posts = try! JSONDecoder().decode([Posts].self, from: data!)
                DispatchQueue.main.async {
                    completion(posts)
                }
            }
            .resume()
        }
    }

1 Ответ

1 голос
/ 26 апреля 2020

Вы получаете сообщение «Структура предварительного просмотра, ОШИБКА: отсутствует аргумент для параметра», как правило, из-за того, что вы не указали обязательные параметры для предварительного просмотра.

ViewPostView ожидает передачи «var post: Posts» так что в ViewPostView_Previews вы должны указать это, например:

    struct ViewPostView_Previews: PreviewProvider {
    static var previews: some View {
        ViewPostView(post: Posts(id: 1, title: "title", ... ))
    }
}
...