我是Swift编程的新手。我有2个类来解析RSS并显示数据。它的名称为ParseRSSFeed
和DetailVC
。但是当我想要解析时,我无法在TableView
中看到数据。
但是,如果我在XMLParserDelegate
中调用DetailVC
的方法,则可行。可能在从另一个类调用方法时我犯了一个错误。
我的代码如下。
我忽略了什么?
ParseRSSFeeds类解析XML
import UIKit
class ParseRSSFeeds: XMLParser, XMLParserDelegate{
var parser = XMLParser()
var news = NSMutableArray()
var elements = NSMutableDictionary()
var element = NSString()
var header = NSMutableString()
var link = NSMutableString()
var desc = NSMutableString()
var date = NSMutableString()
func parseFromUrl(){
news = []
parser = XMLParser(contentsOf: NSURL(string: "https://www.wired.com/feed/rss")! as URL)!
parser.delegate = self
parser.parse()
}
func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String] = [:]) {
element = elementName as NSString
if (elementName as NSString) .isEqual(to: "item") {
elements = NSMutableDictionary()
elements = [:]
header = NSMutableString()
header = ""
link = NSMutableString()
link = ""
desc = NSMutableString()
desc = ""
date = NSMutableString()
date = ""
}
}
func parser(_ parser: XMLParser, foundCharacters string: String) {
if element .isEqual(to: "title"){
header.append(string)
}else if element .isEqual(to: "link"){
link.append(string)
}else if element .isEqual(to: "description"){
desc.append(string)
}else if element .isEqual(to: "pubDate") {
date.append(string)
}
}
func parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {
if (elementName as NSString) .isEqual(to: "item") {
if !header .isEqual(nil) {
elements.setObject(header, forKey: "title" as NSCopying)
}
if !link .isEqual(nil) {
elements.setObject(link, forKey: "link" as NSCopying)
}
if !desc .isEqual(nil) {
elements.setObject(desc, forKey: "description" as NSCopying)
}
if !date .isEqual(nil) {
elements.setObject(date, forKey: "pubDate" as NSCopying)
}
news.add(elements)
}
}
}
DetailVC(它包括显示RSS源的表格视图。)
import UIKit
class DetailVC: UIViewController, UITableViewDelegate, UITableViewDataSource {
@IBOutlet weak var tblNews: UITableView!
let parser = ParseRSSFeeds()
override func viewDidLoad() {
super.viewDidLoad()
ParseRSSFeeds().parseFromUrl()
tblNews.reloadData()
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return parser.news.count - parser.news.count + 5
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
var cell = tblNews.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
if cell .isEqual(NSNull.self) {
cell = Bundle.main.loadNibNamed("cell", owner: self, options: nil)?[0] as! UITableViewCell
}
cell.textLabel?.text = (parser.news.object(at: indexPath.row) as AnyObject).value!(forKey: "title") as? String
cell.detailTextLabel?.text = (parser.news.object(at: indexPath.row) as AnyObject).value!(forKey: "description") as? String
return cell
}
}
答案 0 :(得分:0)
您有两个ParseRSSFeeds
个实例,parser
属性以及您在viewDidLoad
中创建的属性。因此,viewDidLoad
正在创建ParseRSSFeeds
的第二个实例,请求并解析响应,然后丢弃这些结果,保持单独的parser
属性不变。
您应该viewDidLoad
引用parser
属性,而不是创建ParseRSSFeeds
的新实例:
override func viewDidLoad() {
super.viewDidLoad()
parser.parseFromUrl()
...
}