我有以下代码。它的工作方式如下:该表加载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}