
準(zhǔn)備工作
推薦使用 CocoaPods 安裝 Ono 這個(gè)三方,這樣可以省下很多配置的麻煩。
pod 'Ono'
如果手動(dòng)導(dǎo)入的話按照以下步驟就好了
-
下載Ono主分支文件 Ono 下載 ,將下面三個(gè)文件導(dǎo)入到工程中:
-
swift要新建一個(gè)橋接文件
工程名-Bridging-Header.h,創(chuàng)建文件后還要設(shè)置一下:
在橋接文件中引入頭文件
#import "Ono.h"-
因?yàn)镺on這個(gè)庫是基于
libxml2所以工程中要導(dǎo)入這個(gè)庫(好像不知道什么時(shí)候開始 庫的后綴從.dylib變成了.tbd)
在 Build Settings下,Header Search Paths 中添加
$(SDKROOT)/usr/include/libxml2在 Build Settings下,Other Linker Flags 中添加
-lxml2-
因?yàn)閕OS9之后強(qiáng)制使用https所以要在info.plist中加入下面代碼來使程序允許使用http
<key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict>
小說列表
在Main.storyboard 中選中創(chuàng)建好工程后自帶的ViewController,上方工具條 Editor -> Embed In -> Navigation Controller 給ViewController添加一個(gè)UINavigationController

在ViewController中添加一個(gè)UITableView并設(shè)置好代理(或者干脆把ViewController刪除掉使用UITableViewController),并添加一個(gè)空白的cell,設(shè)置好identifier,最終效果如下圖。

在ViewController.swift 添加屬性
var books = [Book]()
在ViewController.swift 的 viewDidLoad() 中添加如下代碼
// 抓取網(wǎng)站的數(shù)據(jù)
let data = NSData(contentsOfURL: NSURL(string: "http://m.ybdu.com/quanben/1")!)
// 將gbk編碼的data轉(zhuǎn)換成UTF-8的字符串
let str = NSString(data: data!, encoding: CFStringConvertEncodingToNSStringEncoding(0x0632))
// 創(chuàng)建 document
let document = try? ONOXMLDocument(string: str as! String, encoding: NSUTF8StringEncoding)
// 解包
if let document = document {
// 根據(jù)CSS規(guī)則檢索節(jié)點(diǎn)并使用閉包遍歷所有檢索結(jié)果
document.enumerateElementsWithCSS(".list p", usingBlock: { (element: ONOXMLElement!, _, _) -> Void in
let bookElement = element.children.first as! ONOXMLElement
let bookHref = (bookElement["href"] as! String).stringByReplacingOccurrencesOfString("/xiazai", withString: "")
self.books.append(Book(uri: bookHref, name: bookElement.stringValue(), author: nil))
})
self.tableView.reloadData()
}
Model類 Book
Book類中暫時(shí)只用到了兩個(gè)屬性uri 和 name
class Book: NSObject {
var uri: String! // 小說 uri
var name: String! // 小說名稱
var author: String? // 小說作者
required init(uri: String!, name: String!, author: String?) {
self.uri = uri
self.name = name
self.author = author
super.init() // 因?yàn)锽ook類繼承了NSObject所以要在子類獨(dú)有的屬性初始化之后調(diào)用父類的初始化方法
}
convenience init(uri: String, name: String!, author: String?) {
self.init(uri: uri, name: name, author: author)
}
}
UITableView代理方法
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.books.count
}
func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
return 44
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("cell")
cell!.textLabel?.text = self.books[indexPath.row].name
return cell!
}
運(yùn)行效果

分析網(wǎng)站節(jié)點(diǎn)
CSS?XPath?都是什么鬼... 具體他們是啥你讓我說我也說不清楚我大概也就了解到我們可以根據(jù)這個(gè)兩個(gè)東西獲取到HTML中指定節(jié)點(diǎn)的屬性和內(nèi)容等。使用谷歌瀏覽器輸入下圖網(wǎng)址框中的地址,按照指示操作就能獲取到我們想要的東西了。簡(jiǎn)單吧!~~~

copy出來的東西大概是這個(gè)樣子的:body > div.list > p:nth-child(2) 多copy幾次,對(duì)照標(biāo)簽的屬性和copy出來的內(nèi)容就明白了,可以看一下Ono的Demo里面有一個(gè)Test寫了各種標(biāo)簽的對(duì)照。
標(biāo)簽中的屬性class="xxx"可以轉(zhuǎn)換成 .xxx
標(biāo)簽中的屬性id="xxx"可以轉(zhuǎn)換成 #xxx
下面的情況可以轉(zhuǎn)換成.list p,這樣根據(jù)這個(gè)規(guī)則就可以把div下所有的p標(biāo)簽解析出來了
<div class="list">
<p></>
</div>
NSError哪去了?
查看Ono的頭文件,初始化一個(gè)ONOXMLDocument對(duì)象,使用下面的類方法。注意OC代碼中最后一個(gè)參數(shù)是一個(gè)NSError類型的變量,但是轉(zhuǎn)換到了swift后這個(gè)NSError消失了!在外面多了一個(gè)throws,具體看下面的圖
/**
Creates and returns an instance of ONOXMLDocument from an HTML string.
@param string The HTML string.
@param encoding The string encoding.
@param error The error error that occured while parsing the HTML, or `nil`.
@return An `ONOXMLDocument` with the contents of the specified HTML string.
*/
+ (instancetype)HTMLDocumentWithString:(NSString *)string
encoding:(NSStringEncoding)encoding
error:(NSError * __autoreleasing *)error;

引用了一個(gè)CSDN的帖子上的原文,具體看這個(gè)鏈接吧。
與Cocoa和Cocoa Touch框架間的交互
現(xiàn)在的問題是,你如何在Swift 2.0中處理爺爺級(jí)的NSError API呢?蘋果公司已經(jīng)在Swift 2.0中為統(tǒng)一代碼行為作了大量工作,并且已經(jīng)為未來寫入>Swift的框架準(zhǔn)備方法。Cocoa和Cocoa Touch中可以產(chǎn)生NSError實(shí)例的方法和函數(shù)有蘋果公司的簽名( signature),可以自動(dòng)轉(zhuǎn)換為Swift新的錯(cuò)誤處理方式。
swift中變態(tài)的構(gòu)造過程
源碼
github: YYReader
master分支->tag 0.2


