提问人:B.Kaan 提问时间:5/11/2018 最后编辑:B.Kaan 更新时间:5/11/2018 访问量:501
Swift 4 - 使用 UITableView 进行 XML 解析
Swift 4 - Xml Parsing with UITableView
问:
我想从XML URL中获取值,但我没有任何错误。我试图理解我的错误。这是我的代码:
import UIKit
class ViewController: UIViewController,UITableViewDelegate,UITableViewDataSource,XMLParserDelegate {
@IBOutlet weak var tblView: UITableView!
var parser = XMLParser()
var haberler = NSMutableArray()
var elements = NSMutableDictionary()
var element = NSString()
var title1 = NSMutableString()
var link = NSMutableString()
override func viewDidLoad() {
super.viewDidLoad()
parsinDataFromURL()
}
我用于解析 xml 的函数
func parsinDataFromURL() {
haberler = []
parser = XMLParser(contentsOf: NSURL(string: "http://www.haberturk.com/rss/kategori/gundem.xml")! as URL)!
parser.delegate = self
parser.parse()
tblView.reloadData()
}
didStartElement、FoundCharacters 和 didEndElement 函数
func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String] = [:]) {
if (elementName as NSString) .isEqual(to: "item") {
elements = NSMutableDictionary()
elements = [:]
title1 = NSMutableString()
title1 = " "
link = " "
}
}
func parser(_ parser: XMLParser, foundCharacters string: String) {
if element .isEqual(to: "title") {
title1.append(string)
}
else if element.isEqual(to: "link") {
link.append(string)
}
}
func parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {
if (elementName as NSString) . isEqual(to: "item") {
if !title1.isEqual(nil) {
elements.setObject(title1, forKey: "title" as NSCopying)
}
if !link .isEqual(nil) {
elements.setObject(link, forKey: "link" as NSCopying)
}
haberler.addObjects(from: [elements])
}
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return haberler.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
var cell = tableView.dequeueReusableCell(withIdentifier: ("myCell"))! as UITableViewCell
if (cell.isEqual(NSNull.self)) {
cell = Bundle.main.loadNibNamed("myCell", owner: self, options: nil)![0] as! UITableViewCell
}
cell.textLabel?.text = (haberler.object(at: indexPath.row) as AnyObject).value(forKey: "title") as? String
cell.detailTextLabel?.text = (haberler.object(at: indexPath.row) as AnyObject).value(forKey: "title") as? String
return cell
}
}
当我在模拟器中运行时,UITableView 是空的(空 UITableViewscreen:https://i.stack.imgur.com/bWX2C.jpg)
答:
0赞
Shehata Gamal
5/11/2018
#1
你必须实现
func parserDidEndDocument(_ parser: XMLParser) {
tblView.reloadData()
}
//
验证是否将表 dataSource 设置为viewDidLoad
self.tblView.dataSource = self
评论
0赞
rmaddy
5/11/2018
OP 已经在调用之后。 不是异步的。reloadData
parse
parse
0赞
rmaddy
5/11/2018
表委托和数据源可能在情节提要中连接,因为表视图是一个出口。在OP提供有关实际问题的更多详细信息之前,此答案只是猜测的集合。
0赞
Shehata Gamal
5/11/2018
@rmaddy我目前做的猜测
0赞
B.Kaan
5/11/2018
我编写函数并将“self.tableview.datasource = self”代码写入 viewDidLoad,但它显示“对成员 'tableview(_:numberOfRowsInSection:)”
0赞
Shehata Gamal
5/11/2018
tableView 名称必须是 tblView 作为你的出口,复制答案中的内容并使你的代码更快速,而不是使用 objective-c 桥接的 API
评论
NSMutableDictionary
NSMutableArray
String
NSMutableString
URL
NSURL
haberler