简体   繁体   中英

Pull to refresh not working with Alamofire and Swift 3

My App uses Alamofire and Swift 3, I have implemented the pull to refresh into my app, but I am sure its not working because I have added the NSDate to my app and it always shows just the time it was loaded not refreshed, also the data just gets added to the bottom of the rows, so when I refresh it doubles my data, does not refresh. My code is below:

import UIKit
import Alamofire
import SVProgressHUD

struct postinput {
    let mainImage : UIImage!
    let name : String!
    let author : String!
    let summary : String!
    let content : String!


}


class TableViewController: UITableViewController {

    //var activityIndicatorView: UIActivityIndicatorView!

    var postsinput = [postinput]()

    var refresh = UIRefreshControl()

    var mainURL = "https://www.example.com/api"

    typealias JSONstandard = [String : AnyObject]

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.


        self.tableView.addSubview(refresh)

        //;refresh.attributedTitle = NSAttributedString(string: "Refreshing...", attributes:[NSForegroundColorAttributeName : UIColor.black])
        refresh.backgroundColor = UIColor(red:0.93, green:0.93, blue:0.93, alpha:1.0)
        //refresh.tintColor = UIColor.white

        refresh.addTarget(self, action: #selector(self.refreshData), for: UIControlEvents.valueChanged)
        //refresh.addTarget(self, action: #selector(getter: TableViewController.refresh), for: UIControlEvents.valueChanged)
        refresh.attributedTitle = NSAttributedString(string: "Updated: \(NSDate())")

        //activityIndicatorView = UIActivityIndicatorView(activityIndicatorStyle: UIActivityIndicatorViewStyle.gray)
        //tableView.backgroundView = activityIndicatorView

        callAlamo(url: mainURL)


    }

    func refreshData() {

        Alamofire.request("https://www.example.com/api").responseJSON(completionHandler: {
            response in
            self.parseData(JSONData: response.data!)
            self.tableView.separatorStyle = UITableViewCellSeparatorStyle.singleLine

            DispatchQueue.main.async {
                self.tableView.reloadData()
                self.refresh.endRefreshing()
            }


        })



    }



    func callAlamo(url : String){
        //activityIndicatorView.startAnimating()
        SVProgressHUD.show(withStatus: "Loading...")
        SVProgressHUD.setDefaultStyle(SVProgressHUDStyle.dark)
        SVProgressHUD.setDefaultAnimationType(SVProgressHUDAnimationType.native)
        SVProgressHUD.setDefaultMaskType(SVProgressHUDMaskType.black)
        Alamofire.request(url).responseJSON(completionHandler: {
            response in
            self.parseData(JSONData: response.data!)
            self.tableView.separatorStyle = UITableViewCellSeparatorStyle.singleLine
            //self.activityIndicatorView.stopAnimating()
            SVProgressHUD.dismiss()


        })


    }


    func parseData(JSONData : Data) {
        do {
            var readableJSON = try JSONSerialization.jsonObject(with: JSONData, options: .mutableContainers) as! JSONstandard
            // print(readableJSON)

            if let posts = readableJSON["posts"] as? [JSONstandard] {
                for post in posts {
                    let title = post["title"] as! String

                    let author = post["author"] as! String

                    guard let dic = post["summary"] as? [String: Any], let summary = dic["value"] as? String else {
                        return
                    }
                    let str = summary.replacingOccurrences(of: "<[^>]+>", with: "", options: .regularExpression, range: nil)
                    print(str)

                    guard let dic1 = post["content"] as? [String: Any], let content = dic1["value"] as? String else {
                        return
                    }
                    let str1 = content.replacingOccurrences(of: "<[^>]+>", with: "", options: .regularExpression, range: nil)
                    print(str1)





                    //print(author)

                    if let imageUrl = post["image"] as? String {
                        let mainImageURL = URL(string: imageUrl )
                        let mainImageData = NSData(contentsOf: mainImageURL!)
                        let mainImage = UIImage(data: mainImageData as! Data)

                        postsinput.append(postinput.init(mainImage: mainImage, name: title, author: author, summary: summary, content: content))
                    }
                }
                DispatchQueue.main.async {
                    self.tableView.reloadData()
                }
            }


        }


        catch {
            print(error)
        }


    }


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

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

        // cell?.textLabel?.text = titles[indexPath.row]

        let mainImageView = cell?.viewWithTag(2) as! UIImageView

        mainImageView.image = postsinput[indexPath.row].mainImage

        mainImageView.layer.cornerRadius = 5.0
        mainImageView.clipsToBounds = true

        //(cell?.viewWithTag(2) as! UIImageView).image = postsinput[indexPath.row].mainImage

        let mainLabel = cell?.viewWithTag(1) as! UILabel

        mainLabel.text = postsinput[indexPath.row].name

        mainLabel.font = UIFont.boldSystemFont(ofSize: 18)

        mainLabel.sizeToFit()

        mainLabel.numberOfLines = 0;

        let autLabel = cell?.viewWithTag(3) as! UILabel

        autLabel.text = postsinput[indexPath.row].author

        autLabel.font = UIFont(name: "Helvetica", size:16)

        autLabel.textColor = UIColor(red: 0.8784, green: 0, blue: 0.1373, alpha: 1.0) /* #e00023 */

        let sumLabel = cell?.viewWithTag(4) as! UILabel

        sumLabel.text = (postsinput[indexPath.row].summary).replacingOccurrences(of: "<[^>]+>", with: "", options: .regularExpression, range: nil)

        sumLabel.font = UIFont(name: "Helvetica", size:16)

        sumLabel.textColor = UIColor(red:0.27, green:0.27, blue:0.27, alpha:1.0)

        //let contentLabel = cell?.viewWithTag(0) as! UILabel

        //contentLabel.text = (postsinput[indexPath.row].content).replacingOccurrences(of: "<[^>]+>", with: "", options: .regularExpression, range: nil)



        //(cell?.viewWithTag(3) as! UILabel).text = postsinput[indexPath.row].author

        return cell!
    }


    override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
        if editingStyle == .delete {
            postsinput.remove(at: indexPath.row)
            tableView.deleteRows(at: [indexPath], with: .fade)
        } else if editingStyle == .insert {
            // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view.
        }
    }

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


}

There is a change in UIRefreshControl for iOS 10. You have been adding refresh control like this: tableView.addSubview(refreshControl). Now, ScrollView, CollectionView and TableView have refreshControl property.

so replace this line :

self.tableView.addSubview(refresh)

to :

self.tableView.refreshControl = refreshControl

better you check iOS version:

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

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