简体   繁体   中英

Pull to Refresh on tableView

I want to pull to refresh for my RSS feed news app. I using navigation controller and table view controller. How should I do on Table View Controller? What should we add? My code is here.

class TableviewController: UITableViewController {

var items : Array<Item> = []
var entries : Array<Entry> = []

override func viewDidLoad() {
    super.viewDidLoad()


    loadRSS()
    loadAtom()
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}


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

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

    let item:Item = self.items[indexPath.row]
    cell.textLabel?.text = item.title
    cell.detailTextLabel?.text = self.pubDateStringFromDate(item.pubDate! as Date)

    return cell
}

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

    let item = self.items[indexPath.row]

    let url:URL = URL(string: item.link!)!
    let safariViewController = SFSafariViewController(url: url, entersReaderIfAvailable: true)
    present(safariViewController, animated: true, completion: nil)
}

func loadRSS() {

    let feedUrlString:String = "websiteurl"

    Alamofire.request(feedUrlString).response { response in

        if let data = response.data, let _ = String(data: data, encoding: .utf8) {

            TIFeedParser.parseRSS(xmlData: data as NSData, completionHandler: {(isSuccess, channel, error) -> Void in

                if (isSuccess) {
                    self.items = channel!.items!
                    self.tableView.reloadData()
                }

                if (response.error != nil) {
                    print((response.error?.localizedDescription)! as String)
                }
            })
        }
    }

}

func loadAtom() {

    let feedUrlString:String = "websiteurl"

    Alamofire.request(feedUrlString).response { response in

        if let data = response.data, let _ = String(data: data, encoding: .utf8) {

            TIFeedParser.parseAtom(xmlData: data as NSData, completionHandler: {(isSuccess, feed, error) -> Void in

                if (isSuccess) {
                    self.entries = feed!.entries!
                    self.tableView.reloadData()
                }

                if (error != nil) {
                    print((error?.localizedDescription)! as String)
                }
            })
        }
    }
}

func pubDateStringFromDate(_ pubDate:Date)->String {
    let format = DateFormatter()
    format.dateFormat = "yyyy/M/d HH:mm"

    let pubDateString = format.string(from: pubDate)
    return pubDateString
}
}

1) Declare an property of type UIRefreshControl as:

 var refreshControl = UIRefreshControl()

2) In viewDidLoad() method add this refreshControl to your table view as:

   self.refreshControl.addTarget(self, action: #selector(loadRSS), for: .valueChanged)

    if #available(iOS 10, *){
        self.tableView.refreshControl = self.refreshControl
    }else{
       self.tableView.addSubview(self.refreshControl)
    }

Declare a property refreshControl in your TableViewController as

   var refreshControl:UIRefreshControl?

The in viewDidLoad() function add the following code

 refreshControl?.addTarget(self, action: #selector(loadRSS), for: .valueChanged)
 self.tableView.addSubview(refreshControl!)

Update your loadRSS() function as

func loadRSS() {

    let feedUrlString:String = "websiteurl"

    Alamofire.request(feedUrlString).response { response in
 self.refreshControl?.endRefreshing(
        if let data = response.data, let _ = String(data: data, encoding: .utf8) {

            TIFeedParser.parseRSS(xmlData: data as NSData, completionHandler: {(isSuccess, channel, error) -> Void in

                if (isSuccess) {
                    self.items = channel!.items!
                    self.tableView.reloadData()
                }

                if (response.error != nil) {
                    print((response.error?.localizedDescription)! as String)
                }
            })
        }
    }

} 

Please refer following code , as i have added pull to refresh control on your code.

class TableviewController: UITableViewController {

    var items : Array<Item> = []
    var entries : Array<Entry> = []

    var  pullToFrefreshNews:UIRefreshControl!

    override func viewDidLoad() {
        super.viewDidLoad()

        loadRSS()
        loadAtom()

        self.addPulltoRefrehs()
    }

    func addPulltoRefrehs() {
        self.pullToFrefreshNews = UIRefreshControl()
        self.pullToFrefreshNews.addTarget(self, action: #selector(TableviewController.loadRSS), for: UIControlEvents.valueChanged)
        self.newsTableVU.addSubview(pullToFrefreshNews)
    }


    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }


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

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

        let item:Item = self.items[indexPath.row]
        cell.textLabel?.text = item.title
        cell.detailTextLabel?.text = self.pubDateStringFromDate(item.pubDate! as Date)

        return cell
    }

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

        let item = self.items[indexPath.row]

        let url:URL = URL(string: item.link!)!
        let safariViewController = SFSafariViewController(url: url, entersReaderIfAvailable: true)
        present(safariViewController, animated: true, completion: nil)
    }

    func loadRSS() {

        let feedUrlString:String = "websiteurl"

        Alamofire.request(feedUrlString).response { response in

            if let data = response.data, let _ = String(data: data, encoding: .utf8) {

                TIFeedParser.parseRSS(xmlData: data as NSData, completionHandler: {(isSuccess, channel, error) -> Void in

                    if (isSuccess) {
                        self.items = channel!.items!
                        self.tableView.reloadData()
                    }

                    if (response.error != nil) {
                        print((response.error?.localizedDescription)! as String)
                    }
                })
            }
        }

    }

    func loadAtom() {

        let feedUrlString:String = "websiteurl"

        Alamofire.request(feedUrlString).response { response in

            if let data = response.data, let _ = String(data: data, encoding: .utf8) {

                TIFeedParser.parseAtom(xmlData: data as NSData, completionHandler: {(isSuccess, feed, error) -> Void in

                    if (isSuccess) {
                        self.entries = feed!.entries!
                        self.tableView.reloadData()
                    }

                    if (error != nil) {
                        print((error?.localizedDescription)! as String)
                    }
                })
            }
        }
    }

    func pubDateStringFromDate(_ pubDate:Date)->String {
        let format = DateFormatter()
        format.dateFormat = "yyyy/M/d HH:mm"

        let pubDateString = format.string(from: pubDate)
        return pubDateString
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM