用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.制作完成
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值