質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

Q&A

解決済

1回答

2939閲覧

UIRefreshControlを使ってtableViewを引っ張って更新したい

aoshima.natsuki

総合スコア33

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

0グッド

1クリップ

投稿2016/08/05 09:39

編集2016/08/05 10:48

質問させてください。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}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fuzzball

2016/08/05 10:27

print(self.articles) の出力は正しく更新されているのにTableViewの表示が更新されていないということでしょうか?それとも articles 自体が更新されていないのでしょうか?
aoshima.natsuki

2016/08/05 10:47 編集

修正のご依頼、ありがとうございます。ただいま気づきました。どうやらAPIから最新のJSONを引っ張ってこれてはいるのですが、 tableViewのデータを更新する際に、一度リフレッシュできておらずどんどん下に溜まっていっているのが原因のようです。 最新の記事も取得できていたので、一度articlesの中身を空にして再度レンダリングしてあげると解決しそうです(self.articles.removeAllなど試しておりますが実行途中でクラッシュしてしまうようです...)。よろしくお願いいたします。
guest

回答1

0

ベストアンサー

swift

1func getArticle(){ 2 : 3 self.articles.removeAll() //←この辺に入れてもダメでしょうか? 4 let json = JSON(object) 5 json.forEach { (_, json) in 6 : 7}

投稿2016/08/05 10:56

fuzzball

総合スコア16731

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aoshima.natsuki

2016/08/05 14:01

ご回答ありがとうございます。お教えいただいたコードで実現できました。 私の記述する位置が間違っており、大変勉強になりました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問