为什么UITableView在tableView.reloadData()之后不显示新数据

时间:2018-04-07 08:56:56

标签: swift xml xcode uitableview

我有以下代码。它的工作方式如下:该表加载XML上的新闻。 fetchXMLData ()函数负责一切。我已通过UIStackView实施了一个菜单。单击菜单项时,XML链接将更改(feedURL变量),fetchXMLData ()函数将再次启动,表将被清除并重新启动,但新数据不可见。虽然print ()打印有关下载源数量的信息。

一般来说,我的问题是:如何将新数据上传到表格中? tableView.reloadData ()没有帮助,或者我做错了什么?谢谢!

MainViewController:

import UIKit

class MainViewController: UIViewController {

@IBOutlet var cityButtons: [UIButton]!
@IBOutlet weak var stack: UIStackView!
@IBOutlet weak var tableView: UITableView!

var feedUrl = "https://tass.ru/rss/v2.xml"
var listOfNewsVM = [XMLParserVM]()

override func viewDidLoad() {
    super.viewDidLoad()

    title = "ТАСС"

    fetchXMLData()

    //self.tableView.backgroundColor = UIColor.black
    tableView.estimatedRowHeight = 30.0
    tableView.rowHeight = UITableViewAutomaticDimension


    }


    func fetchXMLData() {
    XMLParserFactory.fetchData(url: feedUrl) { (listOfXMLVM, error)        in

        print("Fetch xml data")
        print(self.feedUrl)

        if error == nil {
            self.listOfNewsVM = listOfXMLVM!
            self.tableView.reloadData()
        }
        else {
            print(error?.localizedDescription ?? "Error")
        }
    }
}
    }
      extension MainViewController: UITableViewDelegate, UITableViewDataSource {
    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return listOfNewsVM.count
    }

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

        // Segue to the second view controller
        self.performSegue(withIdentifier: "yourSegue", sender: self)
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell  {

        let cell:UITableViewCell = UITableViewCell.init(style: .subtitle, reuseIdentifier: "reuseIdentifier")
        let newsVM = listOfNewsVM[indexPath.row]
        cell.textLabel?.text = newsVM.title
        cell.textLabel?.numberOfLines = 0
        cell.textLabel?.lineBreakMode = .byWordWrapping
        //cell.detailTextLabel?.text = newsVM.link
        //cell.backgroundColor = UIColor.black
        //cell.textLabel?.textColor = UIColor.white
        return cell

    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

        // get a reference to the second view controller
        let secondViewController = segue.destination as! DetailViewController

        // set a variable in the second view controller with the data to pass
        let indexPath = self.tableView.indexPathForSelectedRow!
        let row = indexPath.row
        let newsVM = listOfNewsVM[row]
        secondViewController.receivedData = newsVM.desc
        secondViewController.receivedTitle = newsVM.title
        secondViewController.receivedLink = newsVM.link

    }

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

    w@IBAction func handleSelection(_ sender: UIButton) {

    cityButtons.forEach { (button) in
        UIView.animate(withDuration: 0.3, animations: {
            button.isHidden = !button.isHidden
            self.view.bringSubview(toFront: self.stack)
          })

    }

}
enum Citys: String {
    case topNews = "Топ новости"
    case businnesNews = "Новости бизнеса"

}

    @IBAction func cityTapped(_ sender: UIButton) {

    guard let title = sender.currentTitle, let city = Citys(rawValue: title) else {
        return
    }

    switch city {
    case .topNews:

        feedUrl = "https://life.ru/xml/feed.xml"
        listOfNewsVM.removeAll()
        tableView.reloadData()
        fetchXMLData()


    default:

        feedUrl = "https://tass.ru/rss/v2.xml"
        fetchXMLData()


    }

    }
  }

和XMLParserVM:

import UIKit

class XMLParserFactory {
static func fetchData(url: String, withCallback completionHandler:    @escaping (_ listOfModels: [XMLParserVM]?, _ error: Error?) -> Void) {
    XMLParserClient.sharedInstance().fetchXMLData(for: url) { (newsModelList, error) in

        print("Fetch data  Factory ", newsModelList?.count ?? "0")

        if error == nil {
            var listOfNewsVM = [XMLParserVM]()
            newsModelList?.forEach { model in
                let parserVM = XMLParserVM.init(model)
                listOfNewsVM.append(parserVM)
            }
      //                for item in listOfNewsVM {
     //                    print("\(item.title) - \(item.link)")
    //                }
            completionHandler(listOfNewsVM, nil)
        }
        else {
            completionHandler(nil, error)
        }
    }
   }
  }

 class XMLParserVM {

var model:NewsModel?

init(_ model:NewsModel) {
    self.model = model
}

var title: String {
    if let _ = model {
        return (model?.title)!
    }
    return ""
}

var link: String {
    if let _ = model {
        return (model?.link)!
    }
    return ""
}

var desc: String {
    if let _ = model {
        return (model?.desc)!
    }
    return ""
}

q}

0 个答案:

没有答案