swift實(shí)現(xiàn)一個(gè)小說閱讀器(二)


準(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è)屬性uriname

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)行效果

Simulator Screen Shot 2015年10月23日 11.50.06.png

分析網(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)造過程



類的繼承和構(gòu)造過程


源碼



github: YYReader
master分支->tag 0.2

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,221評(píng)論 4 61
  • 好氣啊寫了一堆沒保存丟了。 要點(diǎn)摘錄? 頹廢2016,乖離性ma,es, ichu ,夢(mèng)百,陰陽師,還有新出的小圓...
    Aoifa閱讀 157評(píng)論 0 0
  • 爆竹聲中辭舊歲, 煙花搖曳游子歸。 合堂老少歡樂事, 紅顏白發(fā)俱親隨。 風(fēng)涼且暖一壺酒, 斜眸三兩是星輝。 此夜不...
    貓?zhí)?/span>閱讀 232評(píng)論 2 1
  • 最近一直在關(guān)注孩子教育的問題,很顯然我這個(gè)新手有太多的東西需要學(xué)習(xí),信息很多,有些也互相矛盾,偶爾我也感到那么一絲...
    亭子文閱讀 213評(píng)論 0 0
  • 今天是訓(xùn)練的第三天18天之后我又是怎樣的一個(gè)特種兵呢?在學(xué)習(xí)路上沒有退縮,只有努力前進(jìn),謝謝所有家人們的理解和支持...
    微商公社玲玲閱讀 221評(píng)論 0 0

友情鏈接更多精彩內(nèi)容