2017-05-08 201 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? –