API: Google News APIを引っ張ってきてWebViewで表示させる
今週からサーバー通信を学習し始めたので、下のサイトを参考に進めます。
参考サイト:
[Swift 1.1] swiftで api を叩いて、JSONをパースして、表示させる方法 (xcodeは6.1, iOSは8.1) - Qiita
iOS - [Swift]APIで取得したJSONをswiftyJSONでパースして、天気情報をUITableViewで表示。お天気アプリを作ってみる。 - Qiita
1) 用意
google newsのAPI
URLの"num=10"が引っ張ってくる記事の数になる
http://ajax.googleapis.com/ajax/services/feed/load? v=1.0&num=10&q=http%3A%2F%2Fnews.google.com%2Fnews%3Foutput%3Drss
SweefyJSON
無料で提供されているライブラリ。最初自力でやろうとしたのですが、昨夜ハマり死にそうになったところで、発見しました。JSONからのパースが本当に楽でした。以下のページからzipをダウンロードし、解凍したフォルダーの中のjson.swiftをDrag&Paste。 lingoer/SwiftyJSON · GitHub
[Swift] JSONを簡単に扱う為のライブラリ SwiftyJSONのサンプル
一見難解なJSONをみやすく段落別けしてくれるので、全体把握に便利です。
2) Master Detail Applicationを選択しプロジェクト開始
3) 全体図
MasterViewController.swift
- Class: UITableViewController
-
override func viewDidLoad():パースする関数の呼び出し
-
func makeTableData():パースする関数を自分で定義
- override func numberOfSectionsInTableView(tableView: UITableView):セクション数を入れる
- override func tableView(tableView: UITableView, numberOfRowsInSection section: Int):セル数入れる
- override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath):セルの中に入れる文字を指定する
cell.textLabel?.text = self.cellItems[indexPath.row] as? String
cell.detailTextLabel?.text = self.urlItem[indexPath.row] as? String
- override func prepareForSegue:Segueで画面遷移する先、遷移する際のkeyを入れる
DetilViewController.swift
Class: UIViewController
Webview:@IBOutlet weak var myWebView: UIWebView!
func configureView():この中にwebviewで開けるようにコードを入れる
4) ハイライト
ーJSONをパースする
MasterViewController.swiftのviewDidLoadの中に関数を呼び込むように仕込んで、外側でパースするための関数定義を別にする。なるほどです。ここ昨夜自力でやろうとしてうまくできなかったところ。swiftyJSONで配列の中の値をパースする場合、一番上からkeyを掘り下げていって表記します。
title = json["responseData"]["feed"]["entries"][i]["title"]
ーSegueで画面遷移させるところは、定石的に使い回し。
ーセットアップ
// セクションの数
let sectionNum = 1
// 1セクションあたりのセルの行数
let cellNum = 10
// 取得するAPI
let url = NSURL(string: "http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&num=10&q=http%3A%2F%2Fnews.google.com%2Fnews%3Foutput%3Drss")
// セルの中身
var cellItems = NSMutableArray()
var urlItem = NSMutableArray()
// ロード中かどうか
var isInLoad = false
// 選択されたセルの列番号
var selectedRow: Int?
5) 結果
GoogleAPIからリストを引っ張り、Webviewで閲覧することができました。WebView表示が最適化されていないのは秘密です。
雑感
ひとまず動いた。。良かった。シンガポールは三連休です。これでハマってコードが動かないと、週明けの、外資系であるある質問”Hey how was the weekend?"と聞かれるたびに悶絶するしかなかったので、ひとまず一歩進めて良かったです。