2.0發布了([在這里安裝內測版](http://www.koulianbing.com/?p=135))。這個大版增加了UGC功能和任務體系,開了發近兩個月,碰到的問題也是最多的。
#### 下拉刷新失效。
當UITableView、UICollectionView不夠一頁的時候,下拉的時候都不會觸發UIScrollVIew的scrollViewDidScroll代理方法。由于下拉刷新控件基于scrollViewDidScroll代理方法來實現。所以在創建UITableView、UICollectionView的時候添加:collectionView.alwaysBounceVertical?=?YES?就好了。//垂直方向遇到邊框是否總是反彈
#### AppDelegate.window與?[UIApplication?sharedApplication].keyWindow的區別
在有UIAlertView時,如果調用了keyWindow,就會出現以下異常。
Terminating?app?due?to?uncaught?exception?'NSInvalidArgumentException',?reason:?'-[_UIAlertShimPresentingViewController?navigationBar]:?unrecognized?selector?sent?to?instance?0x7fb35b6a5c70'
AppDelegate*?appDelegate?=?(AppDelegate*)[UIApplication?sharedApplication].delegate;
UIWindow*?window?=?appDelegate.window;
UIWindow*?keyw?=?[UIApplication?sharedApplication].keyWindow;
在沒有使用UIAlertView時,兩者一樣,均為我們應用的的Window,其delegate為我們的rootViewController。
在調用了UIAlertView?show之后,到UIAlertView消失之前,keyw的值是UIAlertControllerShimPresenterWindow,其delegate是UIAlertShimPresentingViewController。
#### leftBarButton與rightBarButton的設置。
遵從UINavigationController的設計初衷,當UINavigationController的子VC有孫VC時,子VC的navigationItem.title,navigationItem.titleView,leftBarItems,rightBarItems等屬性一定要從孫VC中獲取,不要在孫VC的viewWillAppear,viewDidAppear中直接修改NavigationBar.topItem。否則,像野鳥裝備的第一層TabBar擁有幾個子VC的復雜情況,會在跳轉過程中,發生NavigationBar上的內容顯示混亂的問題,老碼農吃過虧之后痛下決心梳理NavigationBar的顯示邏輯,嚴格遵循UINavigationController的設計初衷,才從痛苦中解脫出來。
#### 關于VC跳轉時結束自身導致的白屏問題。
VCA在結束當前啟動新的VCB時,如果使用present切換時,會留下白屏。push時不會有。參見野鳥裝備的首頁。初次登錄顯示的是視頻播放,用戶點擊“立即體驗”后,結束自身并跳轉到登錄頁面。一開始我的方案是直接把視頻播放VC設置為rootVC,在用戶點擊“立即體驗”時,結束自身,并present一個NavigationVC,NavigationVC的root是首頁的TabVC。但這樣做無論機器性能如何,始終有白屏閃現。后來改為把NavigationVC設置為rootVC,并把視頻播放VC設置為NavigationVC的root,在用戶點擊“立即體驗”時,pop視頻播放VC,再push首頁TabVC。這樣就不會有白屏出現了。
#### NavigationVC的root在特殊情況下有默認leftBarItem的問題。
這個問題跟上面第4個問題是有關聯的。在第4個問題中,白屏的問題是解決了,但首次進入時,首頁TabVC的第一個子VC,也就是“鳥瞰”VC的左上角會顯示系統默認的返回。
最后解決方案是給首頁TabVC的幾個子VC加上空的leftBarItem。
#### iOS7.0下,VC結束時回調delegate導致崩潰。
iOS7.0上,如果VC是被present出來的,當dismiss自身之后,其property都會被置為nil。這個要注意,尤其是需要回調給調用方結果的,需要先把property保存在局部變量中,再dismiss自身,再調用delegate的方法。
#### iOS7.0下無法啟動新VC。
UIImagePickerController的回調方法中,如果你先dismiss?UIImagePickerController,然后緊接著就要啟動新的VC時,一定要小心,在iOS7.0上面,會發現啟動不起來新的VC,Xcode控制臺會打印:Attempt?to?present?<XXXViewController>?on?<UINavigationViewController>?while?a?presentation?is?in?progress!
原因是啟動新VC時,UIImagePickerController還沒有完全dismiss掉。解決方案就是:
[picker?dismissViewControllerAnimated:NO?completion:^{
在這里啟動新VC。
}];
#### 判斷當前VC是否可見。
我這里有一個需求,是在用戶分享(微信、QQ等)完成之后,需要上報分享信息。選擇上報的時機就是用戶完成分享,回到野鳥裝備時。因為上報模塊可能存在于多個VC中,這時就需要有一個邏輯判斷,只有當前可見的VC才具備上報資格。如何判斷,有幾種方式,我選的是第三種:
1、appear和disappear之間設置BaseViewController的變量
2、判斷topVC是否自己,這個要注意NavigationVC和TabBarVC的情況。
3、判斷當前VC的view.window是否為nil。這個最簡單。
#### UIButton設置contentMode無效。
這么搞就可以了
imageButton.imageView.contentMode?=?UIViewContentModeScaleAspectFill;
imageButton.contentHorizontalAlignment=?UIControlContentHorizontalAlignmentFill;
imageButton.contentVerticalAlignment?=?UIControlContentVerticalAlignmentFill;?
#### SDWebImage加載圖片失敗的問題
有一個選項,SDWebImageRetryFailed,默認是沒有開啟的,因此一旦圖片加載失敗,就不會再重試。需要把這個選項打開。