危機感を持った理系学生のプログラミング日記
こんばんわ🦊
まとめたいことができたので書いていきます。
XMLファイルをXMLパーサーに読み込んで解析し、viewに表示してみました。
yahooNewsのXMLファイルを解析して表示すれば、yahooNewsの記事がViewに表示できるようになります。様々なサイトがXMLファイルを公開しているので、tableViewや、SegementSlide等と組み合わせることで、色んなサイトが見栄えよくViewに表示できるようになります。
配列の復習
まず、モデルクラスに配列の要素にするためのクラスを作ります。
class NewsItem{
var title:String!
var url:String!
var pubDate:String!
}
配列を扱いたいControllerクラスで、配列インスタンスを作成します。
この配列はNewsItem型の配列なので、1つの要素はtitle,url,pubDateのプロパティで構成されています。
この配列にappendした場合、[NewsItem,NewsItem,NewsItem,NewsItem] こんな感じになり、このNewsItem要素1つ1つに、title,url,pubDateのプロパティが入っています。
//NewsItem型の配列インスタンスを作成
var newsItem = [NewsItem]()
XMLParser
didStartElement
XMLParserのデリゲートメソッドの1つです。
要素の開始タグがあったら実行されるメソッドです。
XMLParserのデリゲートメソッドでは最初に呼ばれます。
XMLパースの要素の名前がtitleなら、
currentElementName
にnil(空)を入れ、newsItem配列に1つ要素(NewsItem型)を追加。
titleでないなら、
currentElementName
にXMLパースの要素の名前を代入します。
// 解析中に要素の開始タグがあったときに実行されるメソッド
func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String] = [:]) {
currentElementName = nil
if elementName == "item"{
//配列の中にNewsItem型の要素を1つ追加
//NewsItem型は、title,url,pubDateのプロパティで構成されている
self.newsItem.append(NewsItem())
print(elementName)
print(self.newsItem)
}else{
currentElementName = elementName
print(elementName)
}
}
foundCharacters
次に呼ばれるXMLParserのデリゲートメソッドです。
newsItem配列に要素が入っているなら、if文以下が実行されます。
ここで、newsItem配列の要素のプロパティに値を入れていきます。
// 開始タグと終了タグでくくられたデータがあったときに実行されるメソッド
func parser(_ parser: XMLParser, foundCharacters string: String) {
print("要素:" + string)
if self.newsItem.count > 0{
let lastItem = self.newsItem[self.newsItem.count - 1]
switch self.currentElementName {
case "title":
lastItem.title = string
case "link":
lastItem.url = string
case "pubDate":
lastItem.pubDate = string
default:break
}
}
}
didEndElement
3番目に呼ばれるXMLParserのデリゲートメソッドです。
XMLパースの要素の名前にnilを入れてリセットしています。
// 解析中に要素の終了タグがあったときに実行されるメソッド
func parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {
print(elementName)
self.currentElementName = nil
}
これら3つのメソッドはXMLパースの要素の名前が変わる毎にグルグル呼ばれます。
実行結果はこんな感じになります。
item
[Swift5IntroApp1.NewsItem]
要素:
title
要素:本RSSのURLは変更になりました。新しいRSSのURLへ移行をお願いします。
title
要素:
link
link
要素:
item
要素:
item
[Swift5IntroApp1.NewsItem, Swift5IntroApp1.NewsItem]
要素:
TableViewで表示
XMLパーサーで取得したデータをTableViewを使って表示します。
その中でも特にややこしかった、didSelectRowAtに焦点を置きます。
TableViewのセルにXMLパーサーで取得したデータ(ニュースのタイトルとURL)が入っています。セルをタップすると、そのニュースタイトルとURLに基づいたデータをWebViewController(自作のcontroller)で表示します。
key値にニュースのURLの値を入れ、WebViewControllerの方でそれを受け取れるようにします。
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
//WebViewControllerにurl(キー)を渡して表示したい
let webView = WebViewController()
webView.modalTransitionStyle = .crossDissolve
let news = newsItem[indexPath.row]
UserDefaults.standard.set(news.url, forKey: "url")
//webViewに画面遷移
present(webView, animated: true, completion: nil)
}
ざっくりとですが少しややこしかった所をまとめました。
ではまた🦊