2016-12-20 17 views
0

私はAlamofireでSwift 3で自分のアプリを構築しています。 JSONデータがリストビューに表示されます。コンテンツを更新するのではなく、コンテンツを更新するたびに、表示リストを更新するのではなく、リストビューのリストの最後に項目を追加するだけです。私は私のコードは、これまでのところで、私が間違っていることができるか分からない:プル機能が動作しない

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. 
     tableView.separatorStyle = UITableViewCellSeparatorStyle.none 


     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 prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     SVProgressHUD.show() 
     let indexPath = self.tableView.indexPathForSelectedRow?.row 

     let vc = segue.destination as! nextVC 


     vc.articleImage = postsinput[indexPath!].mainImage 
     vc.articleMainTitle = postsinput[indexPath!].name 
     vc.articleContent = postsinput[indexPath!].content 
     SVProgressHUD.dismiss() 

     let backItem = UIBarButtonItem() 
     backItem.title = "Back" 
     navigationItem.backBarButtonItem = backItem // This will show in the next view controller being pushed 



    } 


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


} 

答えて

1

ここであなたの仕事は、あなたのリストにある既存のデータをリフレッシュし、もしあれば新しいアイテムを追加することです。あなたがしなければならないことは、あなたがプル・トゥ・リフレッシュするたびにアイテムをあなたのリストに追加し続けるのではなく、サーバーからあなたのテーブルビューに来る新しいリストを提供するだけです。あなたはすでに配列postsinputを持っているので、追加する前にすべてのアイテムを必ず削除してください。以下は変更を行うことができるあなたのコードです。

func parseData(JSONData : Data) { 

    postsinput.removeAll() 

    do { 

     ... 
     ... 
       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() 
      } 
     ... 
     ... 
} 
+0

これは文字通り私の答えの複製です。私はそれがなぜ受け入れられているのか分かりません... – JAL

5

あなたの問題はここにある:

postsinput.append(postinput.init(mainImage: mainImage, name: title, author: author, summary: summary, content: content)) 

あなたは、古いデータに新しいデータを追加保ちます。新しいデータを追加する前に古いデータを完全に消去したい場合は、postsinput配列からすべての要素を削除するだけです。

+0

しかし、私が理解しているように、その行は、リストビューにすべての要素を追加していますが、削除するとどのようにデータがリストビューに入りますか? – Sole

+0

@SoleあなたのWebリクエストから来た新しいデータを追加する前に、現在配列内にあるすべての要素を削除します。 – JAL

+0

コード例がありますか? – Sole

関連する問題