本來(lái)打算做一款瀏覽器的,但做到一半的時(shí)候發(fā)現(xiàn)這對(duì)iOS開發(fā)的知識(shí)要求不多,反倒對(duì)HTML知識(shí)的要求比較高凑耻。加上Safari基本上實(shí)現(xiàn)了我的要求,所以這個(gè)項(xiàng)目基本上爛尾了柠贤。
暫時(shí)沒(méi)有其他好的想法香浩,所以決定隨大流做一個(gè)V2EX客戶端練練手。畢竟臼勉,這個(gè)才是移動(dòng)應(yīng)用的主流邻吭。從9月24號(hào)動(dòng)手開始到今天10月11號(hào)差不多2周半,我的V2EX客戶端的主體已經(jīng)建起來(lái)了宴霸。
現(xiàn)在把這段時(shí)間的收獲總結(jié)下來(lái)囱晴。
1 兩種HTML解析方法
1.1 簡(jiǎn)單而粗暴的字符串拆解
這個(gè)方法顧名思義膏蚓,就是獲得網(wǎng)頁(yè)的HTML源代碼,利用componentsSeparatedByString:
方法將源代碼斷開畸写,然后查找目標(biāo)字符串驮瞧。方法簡(jiǎn)單,但因?yàn)閿嚅_的關(guān)鍵字往往是無(wú)關(guān)緊要的艺糜,因此代碼可讀性極差剧董。如果想查找的元素較為普遍幢尚,則需要多重循環(huán)才能找到目標(biāo)破停。但對(duì)于網(wǎng)頁(yè)中的特殊元素,采用這個(gè)方法的效率會(huì)非常高尉剩。
這個(gè)方法常常會(huì)試圖獲取兩個(gè)字符串之間的字符串真慢,例如“<href>” 和“</href>”之間的屬性值等。這篇文章提供一段簡(jiǎn)單的代碼可以實(shí)現(xiàn)這個(gè)功能理茎。轉(zhuǎn)帖在下面
- (NSString *)scanString:(NSString *)string startTag:(NSString *)startTag endTag:(NSString *)endTag {
NSString* scanString = @"";
if (string.length > 0) {
NSScanner* scanner = [[NSScanner alloc] initWithString:string];
@try {
[scanner scanUpToString:startTag intoString:nil];
scanner.scanLocation += [startTag length];
[scanner scanUpToString:endTag intoString:&scanString];
}
@catch (NSException *exception) {
return nil;
}
@finally {
return scanString;
}
}
return scanString;
}
1.2 手起刀落的Hpple庫(kù)
Hpple開源在Github上黑界,使用者眾多,代碼簡(jiǎn)單易懂皂林。Hpple之間按照XPath路徑獲取元素朗鸠,比起上面的方法來(lái)說(shuō)精準(zhǔn)多了。使用該方法之前需要對(duì)XPath語(yǔ)法有所了解础倍,這里推薦微軟MSDN的教程烛占。
2 ViewController間的傳值
之前寫了一篇關(guān)于ViewController之間傳值的筆記,但在這次寫客戶端時(shí)發(fā)現(xiàn)都不適合沟启。最簡(jiǎn)單的方法是忆家,在ViewController.h文件中將要傳送的參數(shù)設(shè)置為Property。A向B傳值時(shí)德迹,只要新建一個(gè)B的實(shí)例芽卿,然后賦上具體值再present就好了。
3 UITableView的下拉刷新
UITableView是UIScrollView的子類胳搞。因此UIScrollView類的方法同樣適用卸例。
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
if (!self.isLoading) { //判斷是否正在加載
float height = scrollView.contentSize.height > self.tableView.frame.size.height ? self.tableView.frame.size.height : scrollView.contentSize.height;
if ((height - scrollView.contentSize.height + scrollView.contentOffset.y) / height > 0.2) {
//偏移位移超過(guò)行高的20%時(shí)執(zhí)行......
}
}else {
NSLog(@"Loading");
}
}
4 字體的選擇
蘋果官方只提供了字體列表,沒(méi)有提供字體樣例肌毅】曜可以參考網(wǎng)站 iOS Fonts或者iOS APP :iFont:) 做出選擇。
5 含漢字URL的轉(zhuǎn)碼
直接向Bing傳遞含漢字的URL是無(wú)法打開網(wǎng)頁(yè)的芽腾,必須先手動(dòng)UTF8轉(zhuǎn)碼旦装。
網(wǎng)上找到這條代碼,可以很好地完成任務(wù)摊滔。
NSString *encodedURLString = (NSString *)CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes( kCFAllocatorDefault, (CFStringRef)requestURL, NULL, NULL, kCFStringEncodingUTF8));