2016-11-24 6 views
0

Meine App verwendet Alamofire und Swift 3, ich habe den Pull zum Aktualisieren in meine App implementiert, aber ich bin sicher, es funktioniert nicht, weil ich die NSDate meiner App hinzugefügt habe und es zeigt immer nur die Zeit, die es geladen wurde, nicht aktualisiert, auch die Daten werden nur am Ende der Zeilen hinzugefügt, so dass, wenn ich es aktualisiere meine Daten verdoppelt, nicht aktualisiert. Mein Code ist unten:Pull zum Aktualisieren funktioniert nicht mit Alamofire und Swift 3

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. 
    } 


} 
+0

hat die Refresh genannt? –

+0

Wenn ich pull, um die Daten zu aktualisieren, wird zwar aufgerufen, aber die Tabelle wird nicht aktualisiert View View fügt nur die Daten am Ende der Tabellenansicht hinzu. – rob

Antwort

1

Es gibt eine Änderung in UIRefreshControl für iOS 10. Sie haben wie Auffrischungssteuer schon länger diese: tableView.addSubview (refreshControl). Jetzt haben ScrollView, CollectionView und TableView die Eigenschaft refreshControl.

ersetzen, um diese Zeile:

self.tableView.addSubview(refresh) 

zu:

self.tableView.refreshControl = refreshControl 

besser überprüfen Sie iOS-Version:

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

Dieser Code lässt nur den Pull zum Refresh verschwinden. Es funktioniert nicht – rob

Verwandte Themen