You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift 4 XML解析结合UITableView:列表为空无报错问题排查

解决UITableView显示为空的问题

我帮你排查了代码里的几个关键问题,正是这些细节问题导致你的TableView加载不出数据:

1. 核心问题:foundCharacters无法捕获文本内容

你在didStartElement方法里完全没给element变量赋值!这个变量是用来标记当前正在解析的元素节点,只有当解析到title或link时,把element设置为对应的元素名,foundCharacters里的判断逻辑才会生效,才能把文本内容追加到title1和link变量中。

修改后的didStartElement方法:

func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String] = [:]) {
    element = elementName as NSString // 新增这行,记录当前解析的元素
    if element.isEqual(to: "item") {
        elements = NSMutableDictionary()
        title1 = NSMutableString()
        link = NSMutableString()
    }
}

2. 错误的数组元素添加方式

在didEndElement里,你用了haberler.addObjects(from: [elements]),这个方法是把数组内的所有元素批量添加到haberler中,但你这里只需要添加单个字典对象,直接用haberler.add(elements)更准确:

haberler.add(elements)
// 替换原有的 haberler.addObjects(from: [elements])

3. 无效的非空判断逻辑

你用!title1.isEqual(nil)判断字符串是否为空,但NSMutableString初始化后永远不会是nil,应该判断字符串的长度是否大于0:

if title1.length > 0 {
    elements.setObject(title1, forKey: "title" as NSCopying)
}
if link.length > 0 {
    elements.setObject(link, forKey: "link" as NSCopying)
}

4. 优化TableView的Cell复用逻辑

你的Cell复用代码有冗余,而且还犯了一个小错误:detailTextLabel的内容也取了title,应该改成link。简化后的代码如下:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "myCell", for: indexPath)
    let item = haberler[indexPath.row] as! [String: String]
    cell.textLabel?.text = item["title"]
    cell.detailTextLabel?.text = item["link"] // 修复这里的内容取值错误
    return cell
}

5. 额外优化:将XML解析放到后台线程

parser.parse()是同步操作,如果XML数据较大,会阻塞主线程导致界面卡顿,建议放到后台队列执行,解析完成后回到主线程刷新TableView:

func parsinDataFromURL() {
    haberler.removeAllObjects()
    DispatchQueue.global(qos: .background).async {
        guard let url = URL(string: "http://www.haberturk.com/rss/kategori/gundem.xml") else { return }
        self.parser = XMLParser(contentsOf: url)!
        self.parser.delegate = self
        self.parser.parse()
        
        DispatchQueue.main.async {
            self.tblView.reloadData()
        }
    }
}

把这些修改全部应用后,你的TableView应该就能正常显示解析出来的RSS内容了。

内容的提问来源于stack exchange,提问作者B.Kaan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:09:32