2014-12-12 93 views
0

表視圖,我完全陌生的SWIFT和一般發展中國家。我目前正在建立一個RSS新聞饋送來磨練我的(非常有限的)技能。我基本上是從一個隨機新聞頻道解析RSS提要,然後將這些標題存儲在一個簡單的表格視圖中。拉來刷新SWIFT

我想實現UIPullToRefresh使用SWIFT,並說實話我有點卡住了!我寫了下面的代碼。正如你所看到的,我已經將必要的代碼添加到了我的viewDidLoad方法中。在這一點上刷新微調器工作正常,但我現在想知道我的「刷新功能」需要什麼代碼來實際刷新我的表格視圖。

我知道這可能看起來微不足道的大多數的你們,但我是相當新的這一點,我一直在拉我的頭髮在過去的12小時,所以任何會在這一點上可能有所幫助。

感謝您的幫助!

import UIKit 

class BRTableViewController: UITableViewController, NSXMLParserDelegate { 

    var parser: NSXMLParser = NSXMLParser() 
    var blogPosts: [BlogPost] = [] 
    var postTitle: String = String() 
    var postLink: String = String() 
    var postDate: String = String() 

    var eName: String = String() 


    override func viewDidLoad() { 
     super.viewDidLoad() 
     let url:NSURL = NSURL(string: "http://rt.com/rss/")! 
     parser = NSXMLParser(contentsOfURL: url)! 
     parser.delegate = self 
     parser.parse() 

     // pull to refresh the table view 

     refreshControl!.attributedTitle = NSAttributedString(string: "Pull to refresh") 
     refreshControl!.addTarget(self, action: "refresh:", forControlEvents: UIControlEvents.ValueChanged) 
     tableView.addSubview(refreshControl!) 
    } 


    func refresh(sender:AnyObject){ 
     let url:NSURL = NSURL(string: "http://rt.com/rss/")! 
     parser = NSXMLParser(contentsOfURL: url)! 
     parser.delegate = self 
     parser.parse() 
    } 


     // MARK: - NSXMLParserDelegate methods 

    func parser(parser: NSXMLParser!, didStartElement elementName: String!, namespaceURI: String!, qualifiedName qName: String!, attributes attributeDict: [NSObject : AnyObject]!) { 
     eName = elementName 
     if elementName == "item" { 
      postTitle = String() 
      postLink = String() 
      postDate = String() 
     } 
    } 

    func parser(parser: NSXMLParser!, foundCharacters string: String!) { 
     let data = string.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet()) 
     if (!data.isEmpty) { 
      if eName == "title" { 
       postTitle += data 
      } else if eName == "link" { 
       postLink += data 
      } else if eName == "pubDate" { 
       postDate += data 
      } 
     } 
    } 

    func parser(parser: NSXMLParser!, didEndElement elementName: String!, namespaceURI: String!, qualifiedName qName: String!) { 
     if elementName == "item" { 
      let blogPost: BlogPost = BlogPost() 
      blogPost.postTitle = postTitle 
      blogPost.postLink = postLink 
      blogPost.postDate = postDate 
      blogPosts.append(blogPost) 
     } 
    } 

    override func parser(parser: NSXMLParser!, didEndElement elementName: String!, namespaceURI: String!, qualifiedName qName: String!) { 
     if elementName == "item" { 
      self.tableView.reloadData(); 
      self.refreshControl.endRefreshing(); 
     } 
    } 


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

    // MARK: - Table view data source 

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
     return 1 
    } 

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


    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as UITableViewCell 

     let blogPost: BlogPost = blogPosts[indexPath.row] 
     cell.textLabel.text = blogPost.postTitle 
     cell.detailTextLabel?.text = blogPost.postDate.substringToIndex(advance(blogPost.postDate.startIndex, 25)) 


     return cell 
    } 

    override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 
     return 50.0 
    } 

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) { 
     if segue.identifier == "viewpost" { 
      let selectedRow = tableView.indexPathForSelectedRow()?.row 
      let blogPost: BlogPost = blogPosts[selectedRow!] 
      let viewController = segue.destinationViewController as PostViewController 
      viewController.postLink = blogPost.postLink 
     } 
    } 
} 

回答

0

我認爲這會解決問題:

func refresh(sender:AnyObject){ 
    parser = NSXMLParser(contentsOfURL: url)! 
    parser.delegate = self 
    parser.parse() 

} 

這將重新解析XML和更新blogPosts變量。

viewDidLoad刪除以下行:

refreshControl = UIRefreshControl() 

你也應該重寫parserDidEndDocument功能,包括此:

func parserDidEndDocument(parser: NSXMLParser!){ 

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

這將刷新表視圖,一旦解析器完成。

+0

你好,非常感謝您的快速反應!如上所述,我對編程非常陌生,而且我仍然在努力解決一些基本問題......所以,這裏是我的問題:1)「將UIRefreshControl存儲爲類」的含義是什麼2)會覆蓋parserDidEndDocument?覆蓋FUNC分析器(分析器:的NSXMLParser!didEndElement的ElementName:字符串!,的namespaceURI:字符串!,的qualifiedName QNAME:字符串){ 如果elementName == 「項目」{ self.refresh() }} 非常感謝爲你提供幫助。我真的很感激! – user3694305 2014-12-13 01:27:33

+0

1.我編輯了這個問題來解決這個問題。2.這是正確的,但是您應該將它編輯到問題中。 – 68cherries 2014-12-13 02:45:49

+0

我已經加入你的更新,但我不得不省略「VAR refreshControl:UIRefreshControl」當我得到了一個錯誤,顯然UIRefreshControl已經是已經的UITableViewController聲明refreshControl,所以我沒有必要再聲明這...這表示我仍然得到與「覆蓋parserDidEndDocument」功能錯誤... – user3694305 2014-12-13 03:24:06