#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 в приведенный выше код. Извините за это.