質問させてください。Swift初心者です。
SwiftyJSON と alamofire を用いて、Qiitaの新着記事を
tableViewに表示するアプリを勉強用につくっています。
「最新の20件を取得、セルをタップでwebViewに遷移する」 ところまでは実装でき、これに引っ張って更新する機能を追加しようとしています。
ブラウザ上でJSONを確認しながら、端末側で定期的に引っ張って更新を試みているのですが、なぜかデータが更新されなく困っています。
更新を呼んでいる箇所 func refresh()
あたりに問題があるのかな、と思い
参考サイトなど読み漁っているのですが肝心のところが省略されているものが多く
自分なりに試行錯誤していますが、どうしても解決できません。。該当の箇所でprintで出力してデバッグをしていますが、特に問題はなく呼ばれているようで原因がわかりません。
お詳しい方おられましたらどうか教えていただきたいです。また、こういったケースでのデバッグの方法などで良いものがあればそちらも併せて教えていただけますと嬉しいです。どうかよろしくお願いいたします。
追記(2016-08-05 19:48): どうやらAPIから最新のJSONを引っ張ってこれてはいるのですが、 tableViewのデータを更新する際に、一度リフレッシュできておらずどんどん下に溜まっていっているのが原因のようです。 最新の記事も取得できていたので、一度articlesの中身を空にして再度レンダリングしてあげると解決しそうです(self.articles.removeAllなど試しておりますが実行途中でクラッシュしてしまうようです...)。よろしくお願いいたします。
swift
1import UIKit 2import SwiftyJSON 3import Alamofire 4 5class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 6 7 var articles: [[String: String?]] = [] 8 var tableView: UITableView = UITableView() 9 var refreshControl: UIRefreshControl = UIRefreshControl() 10 11 override func viewDidLoad() { 12 super.viewDidLoad() 13 14 // ヘッダーにタイトルを設定する 15 self.navigationItem.title = "Home" 16 17 // TableViewを生成する 18 tableView.frame = view.frame 19 20 // Viewに追加する 21 view.addSubview(tableView) 22 23 // DataSourceの設定をする 24 tableView.dataSource = self 25 26 // Delegateを設定する 27 tableView.delegate = self 28 29 getArticle() 30 31 // リフレッシュコントロールの設定をしてテーブルビューに追加 32 self.refreshControl = UIRefreshControl() 33 self.refreshControl.attributedTitle = NSAttributedString(string: "引っ張って更新") 34 self.refreshControl.addTarget(self, action: #selector(ViewController.refresh), forControlEvents: UIControlEvents.ValueChanged) 35 self.tableView.addSubview(refreshControl) 36 37 // Do any additional setup after loading the view, typically from a nib. 38 } 39 40 override func didReceiveMemoryWarning() { 41 super.didReceiveMemoryWarning() 42 // Dispose of any resources that can be recreated. 43 } 44 45 func getArticle(){ 46 Alamofire.request(.GET, "https://qiita.com/api/v2/items") 47 .responseJSON { response in 48 guard let object = response.result.value else { 49 return 50 } 51 let json = JSON(object) 52 json.forEach { (_, json) in 53 // responseのresultプロパティのvalueプロパティを表示 54 // print(response.result.value) 55 // 記事タイトルを表示 56 // print("title:",json["title"].string) 57 // ユーザー名を表示 58 // print("user:",json["user"]["id"].string) 59 60 // 1つの記事を表す辞書型をつくる 61 let article: [String: String?] = [ 62 "id": json["id"].string, 63 "title": json["title"].string, 64 "user_id": json["user"]["id"].string 65 ] 66 // 配列に入れる 67 self.articles.append(article) 68 } 69 // print(self.articles) 70 self.tableView.reloadData() 71 print("call data reload.") 72 } 73 } 74 75 func refresh(){ 76 print("call refresh.") 77 78 getArticle() 79 self.refreshControl.endRefreshing() 80 } 81 82 // Cellが選択された際に呼び出される 83 func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 84 let article = articles[indexPath.row] 85 print(article["user_id"]!) 86 print(article["id"]!) 87 88 let nav = WebViewController() 89 nav.userId = String(article["user_id"]!!) 90 nav.articleId = String(article["id"]!!) 91 self.navigationController?.pushViewController(nav, animated: true) 92 } 93 94 // Tableに表示する配列の総数を返す 95 func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 96 return articles.count 97 } 98 99 // Cellに値を設定する 100 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 101 let cell = UITableViewCell(style: .Subtitle, reuseIdentifier: "cell") 102 let article = articles[indexPath.row] 103 cell.textLabel?.text = article["title"]! 104 cell.detailTextLabel?.text = article["user_id"]! 105 return cell 106 } 107 108}
回答1件
あなたの回答
tips
プレビュー