Swift 4 - 使用 UITableView 进行 XML 解析

Swift 4 - Xml Parsing with UITableView

提问人:B.Kaan 提问时间:5/11/2018 最后编辑:B.Kaan 更新时间:5/11/2018 访问量:501

问:

我想从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)

iOS Swift XML 解析

评论

0赞 rmaddy 5/11/2018
这就是斯威夫特。你应该使用 Swift 类。使用 Swift 字典,而不是 .使用 Swift 数组,而不是 .使用 ,而不是 。使用 ,而不是 。NSMutableDictionaryNSMutableArrayStringNSMutableStringURLNSURL
0赞 rmaddy 5/11/2018
你做了什么调试?是否调用了任何 XMLParse 委托方法?您的阵列是否正在填充?haberler
0赞 B.Kaan 5/11/2018
我刚刚打印了“haberler”,它总是显示: { link = “ ”;标题 = “ ”; },

答:

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 已经在调用之后。 不是异步的。reloadDataparseparse
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