Почему я не могу передать разделенные XML-данные в contentView в SwiftUI?

#xml #swiftui #xml-parsing #nsxmlparser #swiftui-navigationlink

#xml #swiftui #xml-синтаксический анализ #nsxmlparser #swiftui-navigationlink

Вопрос:

Я пишу приложение для чтения новостей, получающее контент с веб-сайта (RSSFeed). (используя XMLParser,XMLParserDelegate в SwiftUI).

Моя цель: экран 1: он покажет заголовки и Pubdata. Затем, когда пользователи нажимают на заголовок, он переходит к экрану2.

Проблема, с которой я сталкиваюсь: я пытаюсь передать parsedData в contentView. Но это не отображается на экране. Было бы признателен, если бы вы, ребята, могли помочь определить проблему и дать несколько советов. Я много изучал это и ничего не придумал. Большое спасибо!!

P / S: я новичок в SwiftUI


   import Foundation
  import UIKit

 class NetworkManager : NSObject, ObservableObject, XMLParserDelegate {

 @Published var posts = [ItemData]()

 var items : [ItemData] = []
 var dataOfRssFeed : [String] = [] //// <title>, <link>...
 var arrFinal : [[String]] = [] ////  store dataOfRssFeed
 var content : String = "" /// <> content </>


func fetchData(){
    if let url = URL(string: "https://vietstock.vn/144/chung-khoan.rss") {
        let session = URLSession(configuration: .default)
        let task = session.dataTask(with: url ) { (data, response, error) in
            // Data amp; error checking
            if error == nil {
                let parser = XMLParser(contentsOf: url)
                parser?.delegate = self
                parser?.parse()
                if let safeData = data {
                    _ = String(data: safeData, encoding: .utf8)
                    DispatchQueue.main.async {  
                        self.posts = self.items
                        print(self.posts)
                    }
                    return
                } 
            }
        }
        task.resume()
    }
}
 

 //MARK: NetworkManager :XMLParserDelegate

// Started parsing document
func parserDidStartDocument(_ parser: XMLParser) {
    dataOfRssFeed.removeAll()
}

//Found start tag for element
func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String] = [:]) {
    
    if elementName == "item" {
        dataOfRssFeed.removeAll() 
    } }

//  Get called when parser finds a new character for a particular Element.
func parser(_ parser: XMLParser, foundCharacters string: String) {
    content = string 
}

// This get called when the element ends
func parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {
    
    if elementName == "title" || elementName == "link" || elementName == "pubDate" || elementName == "description" {
        dataOfRssFeed.append(content)
    }
    else if elementName == "item" {
        arrFinal.append(dataOfRssFeed)      
    } } 

// parser stops reading an XML file.
func parserDidEndDocument(_ parser: XMLParser) {
 print(arrFinal)
}  }
 

Вот мой код contentView :

 import SwiftUI

struct ContentView: View {

@ObservedObject var networkManager = NetworkManager()

var body: some View {
    NavigationView {
        List (networkManager.posts) { post in
            NavigationLink(destination: DetailView(url: post.link)) {
                HStack {
                    Text(post.pubDate)
                    Text(post.title)
                }
            }
        }
        .navigationBarTitle("STOCK NEWS")
    }
    .onAppear {
        self.networkManager.fetchData()
    }
}   
}
 struct ContentView_Previews: PreviewProvider {
static var previews: some View {
    Group {
        ContentView()
        ContentView()
    }  }  }
 

Вот подробное представление :

 struct DetailView: View {
let url : String?
var body: some View {
    WebView(urlString: url)
 } }
struct DetailView_Previews: PreviewProvider {
static var previews: some View {
    DetailView(url: "https://www.google.com") 
} 
 

}

Вот веб-просмотр:

 import Foundation
import WebKit
import SwiftUI
 

// ЦЕЛЬ: как отображать веб-сайты на 2-м экране

 struct WebView : UIViewRepresentable {

let urlString : String?

func makeUIView(context: Context) -> WKWebView {
    return WKWebView()
}

func updateUIView(_ uiView: WKWebView, context: Context) { /// render the WebKit view uses that URL
    
    if let safeString = urlString {
        if let url = URL(string: safeString) {
            let request = URLRequest(url: url)
            uiView.load(request)
 

Комментарии:

1. Где код для DetailView? «Это не отображается на экране» в contentView или DetailView?

2. Я добавил DetailView amp; WebView в приведенный выше код. Извините за это.