【Swift４.０】タブ型ニュースアプリ作成〜第２回〜

 　タブ型ニュースアプリ作成の第2回になります。
　前回ではXcodeのプロジェクト作成、各ライブラリやボタンの定義までを行いました。
　今回はニュース記事の取得から、画面表示のプロパティ設定までを行います。 
  
　(1)XMLPerserを利用してニュース記事のデータを解析します。

ViewController1.swift

```swift
// Swift4.0

    //XMLを解析する(パース)
        let url:String = "https://news.yahoo.co.jp/pickup/domestic/rss.xml"
        let urlToSend:URL = URL(string:url)!
        paser = XMLParser(contentsOf: urlToSend)!
        totalBox = []
        paser.delegate = self
        paser.parse()
        tableView.reloadData()

        // Do any additional setup after loading the view.
    }
    
    @objc func refresh() {
        perform(#selector(delay), with: nil, afterDelay: 2.0)
        
        
    }
    @objc func delay() {
        //XMLを解析する(パース)
        let url:String = "https://news.yahoo.co.jp/pickup/domestic/rss.xml"
        let urlToSend:URL = URL(string:url)!
        paser = XMLParser(contentsOf: urlToSend)!
        totalBox = []
        paser.delegate = self
        paser.parse()
        tableView.reloadData()
        refreshControl.endRefreshing()
    }
```
  
　(2)webViewの画面の動作（戻る・進むボタン）および画面の表示形式を
　   各functionに定義していきます。

ViewController.swift

```swift
// Swift4.0

 //webViewを１ページ進める
    @objc func nextPage() {
        webView.goForward()
        
    }
    //webViewを1ページ戻す
    @objc func backPage() {
        webView.goBack()
        
    }
    //webViewを隠す
    @objc func cancel() {
        webView.isHidden = true
        goButton.isHidden = true
        backButton.isHidden = true
        cancelButton.isHidden = true
        
    }
    
    
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 100
    }
    
    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return totalBox.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = UITableViewCell(style: .subtitle, reuseIdentifier: "Cell")
        
        cell.selectionStyle = .none
        cell.backgroundColor = UIColor.clear
        cell.textLabel?.text = (totalBox[indexPath.row] as AnyObject).value(forKey: "title") as? String
        cell.textLabel?.font = UIFont.boldSystemFont(ofSize: 15.0)
        cell.textLabel?.textColor = UIColor.white
        
        
        cell.detailTextLabel?.text = (totalBox[indexPath.row] as AnyObject).value(forKey: "link") as? String
        cell.detailTextLabel?.font = UIFont.boldSystemFont(ofSize: 9.0)
        cell.detailTextLabel?.textColor = UIColor.white
        
        
        return cell
        
    }
    
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        //webViewを表示する
        let linkURL = (totalBox[indexPath.row] as AnyObject).value(forKey: "link") as? String
        let urlStr = linkURL?.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)
        let url:URL = URL(string: urlStr!)!
        let urlRequest = NSURLRequest(url:url)
        webView.loadRequest(urlRequest as URLRequest)
    }
    
    func webViewDidStartLoad(_ webView: UIWebView) {
        dotsView.isHidden = false
        dotsView.startAnimating()
    }
    func webViewDidFinishLoad(_ webView: UIWebView) {
        dotsView.isHidden = true
        dotsView.stopAnimating()
        webView.isHidden = false
        goButton.isHidden = false
        backButton.isHidden = false
        cancelButton.isHidden = false}     

```
  
　(3)XMLPerserを利用してニュース記事のデータを解析します。

  
```swift
// Swift4.0

//タグを見つけたとき
    func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String] = [:]) {
        
        element = elementName
        
        if element == "item" {
            
            elements = NSMutableDictionary()
            elements = [:]
            titleString = NSMutableString()
            titleString = ""
            linkString = NSMutableString()
            linkString = ""
            
            
        }
    }
    
    
    //タグの間にデータがあったとき(開始タグと終了タグでくくられた箇所にデータが存在したとき実行されるメソッド)
    func parser(_ parser: XMLParser, foundCharacters string: String) {
        if element == "title" {
            titleString.append(string)
        }else if element == "link" {
            linkString.append(string)
        }
    }
    
    //タグの終了を見つけたとき
    func parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {
        //itemという要素が中にあるなら、
        if elementName == "item" {
            //titleString(linkString)の中身が空でないなら、
            if titleString != "" {
                
                 //elementsにキー値を付与しながらtitleString(linkString)をセットする
                elements.setObject(titleString, forKey: "title" as NSCopying)
            }
            if linkString != "" {
                
                elements.setObject(linkString, forKey: "link" as NSCopying)
            }
             //totalBoxの中にelementsを入れる
            totalBox.add(elements)
            
        }
        
        
    }  

```

以上でタブ型ニュースアプリの完成です。
Githubを見たい方がいましたら、お気軽にご連絡下さい。