用swift和XML編寫ios應用-RSS閱讀器

版本:

swift 4,ios 11.3

1.設定TableView
這裏寫圖片描述
2.添加一個cell
這裏寫圖片描述
3.連接到NavigationController
這裏寫圖片描述
4.添加WebKitView
這裏寫圖片描述
5.配對cell到WebKitView
這裏寫圖片描述
6.連接WebView到代碼中
這裏寫圖片描述
7.添加ActivityIndicator
這裏寫圖片描述
8.添加網址讀取
這裏寫圖片描述
9.編寫代碼

ViewController.swift

//  ViewController.swift
//  RSSReader
//
//  Created by lin on 2018/3/31.
//  Copyright © 2018年 lin. All rights reserved.
//

import UIKit

struct NewsItem {
    var title:String?
    var link:String?
}

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
    @IBOutlet weak var myTableView: UITableView!
    var objects = [NewsItem]()
    let xmlAddress = "https://www.cnet.com/rss/news/"
    var session = URLSession(configuration: .default)

    override func viewDidLoad() {
        super.viewDidLoad()
        myTableView.dataSource = self
        myTableView.delegate = self
        downloadXML(withXMlAddress: xmlAddress)
    }

    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return objects.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
        cell.textLabel?.text = objects[indexPath.row].title
        return cell
    }

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { //消除選中行後的陰影
        tableView.deselectRow(at: indexPath, animated: true)
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {  //傳遞網址到WebViewController
        if segue.identifier == "showinfo"{
            if let dvc = segue.destination as? WebViewController{
                //dvc.linkFromViewOne
                if let selectedRow = myTableView.indexPathForSelectedRow?.row{
                    dvc.linkFromViewOne = objects[selectedRow].link
                }
            }
        }
    }

    func downloadXML(withXMlAddress xmlAddress:String){
        if let url = URL(string: xmlAddress){
            let task = session.dataTask(with: url, completionHandler: {
                (data, response, error) in
                if error != nil{
                    DispatchQueue.main.async {
                        self.popAlert(withTitle: "Sorry")
                    }
                    return
                }
                if let okData = data{
                    let parser = XMLParser(data: okData)
                    let rssParserDelegate = RSSParserDelegate()
                    parser.delegate = rssParserDelegate
                    if parser.parse() == true{
                        self.objects = rssParserDelegate.getResult()
                        DispatchQueue.main.async {
                            self.myTableView.reloadData()
                        }
                    }else{
                        print("parse fail")
                    }

                    //print(NSString(data: okData, encoding: String.Encoding.utf8.rawValue))
                }
            })
            task.resume()
        }
    }

    func popAlert(withTitle title:String){
        let alert = UIAlertController(title: title, message: "Please try again later", preferredStyle: .alert)
        alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
        present(alert, animated: true, completion: nil)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

WebViewController.swift

//  WebViewController.swift
//  RSSReader
//
//  Created by lin on 2018/3/31.
//  Copyright © 2018年 lin. All rights reserved.
//

import UIKit
import WebKit

class WebViewController: UIViewController, WKNavigationDelegate {
    @IBOutlet weak var myWebView: WKWebView!
    var linkFromViewOne:String?

    @IBOutlet weak var myActivityIndicator: UIActivityIndicatorView!

    override func viewDidLoad() { //讀取傳過來的信息
        super.viewDidLoad()
        myWebView.navigationDelegate = self
        if let okLink = linkFromViewOne, let okURL = URL(string: okLink){
            let request = URLRequest(url: okURL)
            myWebView.load(request)
        }

    }

    func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {
        myActivityIndicator.startAnimating()
    }

    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
        myActivityIndicator.stopAnimating()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

RSSParserDelegate.swift

//  RSSParserDelegate.swift
//  RSSReader
//
//  Created by lin on 2018/3/31.
//  Copyright © 2018年 lin. All rights reserved.
//

import Foundation

class RSSParserDelegate:NSObject, XMLParserDelegate{
    var currentItem:NewsItem?  //每解析到一則新聞就存到currentItem裏面
    var currentElementValue:String?  //用來存解析到的文字
    var resultsArray = [NewsItem]()  //用來存NewItem的陣列

    //XMLParserDelegate的三個方法
    func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String] = [:]) {    //碰到開始標籤就會執行這個方法
        if elementName == "item"{
            //start a new item
            currentItem  = NewsItem()
        }else if elementName == "title"{
            currentElementValue = nil
        }else if elementName == "link"{
            currentElementValue = nil
        }
    }

    func parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {  //碰到結束標籤就會執行這個方法
        if elementName == "item"{
            if currentItem != nil{
                resultsArray.append(currentItem!)
                currentItem = nil
            }
        }else if elementName == "title"{
            currentItem?.title = currentElementValue
        }else if elementName == "link"{
            currentItem?.link = currentElementValue
        }
        currentElementValue = nil
    }

    func parser(_ parser: XMLParser, foundCharacters string: String) {   //解析到資料就會執行這個方法
        if currentElementValue == nil{
            currentElementValue = string
        }else{
            currentElementValue = currentElementValue! + string
        }
    }

    func getResult() -> [NewsItem]{
        return resultsArray
    }
}

10.製作完成
這裏寫圖片描述

發佈了28 篇原創文章 · 獲贊 10 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章