2017-05-08 202 views
0

所以,我有这个应用程序加载RSS饲料,我已经实现了刷新功能。上传刷新后,它会重新加载并添加新帖子(如果已发布但前一数据保留在此处并被添加到堆栈中)。检查代码和图像。我在下面附上。刷新功能不能按预期工作Swift 3

// 
// TableViewController.swift 
// WebView 
// 

import UIKit 

class TableViewController: UITableViewController,XMLParserDelegate{ 

    var currentElement:String = "" 
    var postTitle:String = "" 
    var webLink:String = "" 
    var feeds:[Model] = [] 
    var reload: UIRefreshControl! = UIRefreshControl() 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     //let urlToSend: NSURL = NSURL(string: "https://sensodyneforsensitiveteeth.wordpress.com/feed")! 
     let urlToSend: NSURL = NSURL(string: "http://froshgeek.com/feed")! 
     let parser = XMLParser(contentsOf: urlToSend as URL)! 
     parser.delegate = self 
     parser.parse() 
     //reload 
     reload!.attributedTitle = NSAttributedString(string: "Pull to reload the page") 
     reload!.addTarget(self, action: #selector(TableViewController.reloadFunc), for: UIControlEvents.valueChanged) 
     tableView.addSubview(reload) 
     reload.endRefreshing() 


     // Uncomment the following line to preserve selection between presentations 
     // self.clearsSelectionOnViewWillAppear = false 

     // Uncomment the following line to display an Edit button in the navigation bar for this view controller. 
     // self.navigationItem.rightBarButtonItem = self.editButtonItem() 
    } 

    func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String]) { 
     currentElement=elementName; 
     if(elementName=="item") 
     { 
      postTitle = String() 
      webLink = String() 
     } 
    } 

    func parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) { 
     if(elementName=="item"){ 
      let feed: Model = Model() 
      feed.postTitle = postTitle 
      feed.webLink = webLink 
      feeds.append(feed) 

     } 
    } 

    func parser(_ parser: XMLParser, foundCharacters string: String) { 
     let data = string.replacingOccurrences(of: "^\\s*", with: "", options: .regularExpression) 
     if (!data.isEmpty){ 
      if currentElement == "title" { 
       postTitle += data 
      } 
      else if currentElement == "link" { 
       webLink += data 
      } 
     } 
    } 

    func parser(_ parser: XMLParser, parseErrorOccurred parseError: Error) { 
     print("Bad XML File, Please validate") 
    } 

    func reloadFunc(_ sender: AnyObject){ 

     viewDidLoad() 

     self.tableView.reloadData() 
    } 

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

    // MARK: - Table view data source 

    override func numberOfSections(in tableView: UITableView) -> Int { 
     // #warning Incomplete implementation, return the number of sections 
     return 1 
    } 

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     // #warning Incomplete implementation, return the number of rows 
     return feeds.count 
    } 


    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "webFeeds", for: indexPath) 

     let feeds: Model = self.feeds[indexPath.row] 
     cell.textLabel?.text = feeds.postTitle 

     return cell 
    } 

    // MARK: - Navigation 

    // In a storyboard-based application, you will often want to do a little preparation before navigation 
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     if segue.identifier == "webParse" { 
      let feed: Model = feeds[tableView.indexPathForSelectedRow!.row] 
      let pageView = segue.destination as! ViewController 
      pageView.webLink = feed.webLink 
     } 
    } 

    func parserDidEndDocument(_ parser: XMLParser){ 

     self.tableView.reloadData(); 
     self.refreshControl?.endRefreshing(); 
    } 
} 

Model.swift

// 
// Model.swift 
// WebView 
// 

import Foundation 

class Model { 
    var postTitle:String = "" 
    var webLink:String = "" 
    var currentElement:String = "" 

} 

ViewController.swift

// 
// ViewController.swift 
// WebView 
// 

import UIKit 

class ViewController: UIViewController, UIWebViewDelegate { 

    @IBOutlet weak var showPage: UIWebView! 
    var webLink: String = String() 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     let link : NSURL = NSURL(string: webLink)! 
     let req : NSURLRequest = NSURLRequest(url: link as URL) 
     showPage.loadRequest (req as URLRequest) 
     showPage.delegate = self 
    } 

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


} 

截图在重装

enter image description here

回答

0

它是在LA添加对象的理由st是因为你需要在刷新数据之前清空你的数组。也绝不要明确地调用viewDidLoad你需要做的是使一个方法,使这个API请求,并从viewDidLoad和你的刷新方法调用该方法。

override func viewDidLoad() { 
    super.viewDidLoad() 
    //call function to get xml data 
    self.getData() 

    //reload 
    reload!.attributedTitle = NSAttributedString(string: "Pull to reload the page") 
    reload!.addTarget(self, action: #selector(TableViewController.reloadFunc), for: UIControlEvents.valueChanged) 
    tableView.addSubview(reload) 
    reload.endRefreshing() 
} 

func getData() { 
    //Make array empty first 
    feeds = [] 

    let urlToSend: NSURL = NSURL(string: "http://froshgeek.com/feed")! 
    let parser = XMLParser(contentsOf: urlToSend as URL)! 
    parser.delegate = self 
    parser.parse() 
} 

现在把这块getData功能在你的刷新操作方法reloadFunc

func reloadFunc(_ sender: AnyObject){ 

    self.getData() 
    self.tableView.reloadData() 
} 
+0

谢谢兄弟,你是金:) –

+0

@FoxMulder检查编辑答案。 –

+0

感谢兄弟,你能告诉我为什么我们不应该像我那样以这种方式调用viewDidLoad? –