版本:
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.製作完成