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
相关产品推荐
相关产品推荐

