獲取當前控制器
感覺這個功能很有用,尤其有這樣需求的時候:UITableViewCell上面有些Button,點擊后跳轉到其他控制器,有些情況下需要統一跳轉到某個控制器,比如當檢測到用戶登錄過期的時候跳轉到登錄控制器顯然這是一個統一的操作,就是需要在AF里面拿到當前控制器進行跳轉。所以根據App的情況寫了一個方法獲取當前控制器,主要是遞歸遍歷
,目前用起來還不錯
+(UIViewController*)getCurrentVC
{
//先取tabbar
UIWindow * keyWindow = [[[UIApplication sharedApplication]delegate]window];
HSTabbarViewController * tabbar =(HSTabbarViewController*)keyWindow.rootViewController;
//再取導航欄
if ([tabbar isKindOfClass:[HSTabbarViewController class]] ) {
HSNavigationViewController* currentNav = tabbar.childViewControllers[tabbar. selectedIndex];
UIViewController * VC = [currentNav.childViewControllers lastObject];
//調用下面的方法遞歸尋找
UIViewController * topVC = [self getTopViewController:VC];
return topVC;
}
return nil;
}
+(UIViewController*)getTopViewController:(UIViewController *)vc
{
if (vc.presentedViewController==nil) {
if (![vc isKindOfClass:[UINavigationController class]]) {//不是導航欄控制器,并且沒有present視圖
return vc;
}
if ([vc isKindOfClass:[UINavigationController class]]) {
return [self getTopViewController:[vc.childViewControllers lastObject]];
}
return vc;
}
else{
return [self getTopViewController:vc.presentedViewController];
}
}
正式測試服務器切換
工作中經常要打包app,一會要測試版本,一會要正式版本。其實正式版面和測試版本沒有什么太大差別,主要就是訪問的url不同,還有些調試開關有沒有打開,比如https是否檢測證書,日志打印等等。
根據開關的狀態切換正式測試服務器的地址,貌似許多操作都可以定義在開關狀態切換之間,但是用
宏定義的除外
,比如原來某些開關或者訪問的url是用宏定義的,在這里想通過開關切換是行不通的,因為宏是控制代碼的,代碼不能控制宏的編譯
,不知道是不是這樣理解的,所以我在開關切換的都是全局變量,而不能是宏。
服務器返回error500錯誤
自己csdn的博客寫過 http://blog.csdn.net/a158337/article/details/52167008,因為在工作中大部分用到的網絡請求框架都是AF,一般服務器出錯的時候會調用網絡請求失敗方法,常見的是404,-1009等等,這些都會提示,但是服務器存在代碼錯誤的時候會報告500,有的時候服務器端的開發者需要我們幫忙查看錯誤原因,尤其是請求的參數比較復雜的時候,根本不能指望他們在瀏覽器輸入鏈接自己看。在AF的fail方法里加入如下代碼就可以完成對信息的查看了
NSString * tips = [NSString stringWithFormat:@"%ld %@",(long)error.code,error.userInfo[@"NSLocalizedDescription"]];
NSData * data = error.userInfo[@"com.alamofire.serialization.response.error.data"];
NSString * message = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
if (error.code==500) {
HSWebViewController * webVC = [[HSWebViewController alloc]init];
[webVC.webView loadHTMLString:message baseURL:nil];
[[HSTool getCurrentVC].navigationController pushViewController:webVC animated:YES];
fail(error);
}
另外自己的同事改進了一下。只要是服務器返回的500錯誤,統一用webview加載信息非常方便,給php開發人員安裝一個app讓他自己測就可以了。
重復發送一個請求測試
過去有段時間服務器大幅度調整,很多數據不是缺字段就是格式不正確,或者前兩天剛剛定的字段名稱又變了,或者安卓那邊加了一個新功能,我都不知道,然后我只能抓安卓的包根據業務猜測。都知道在iOS里面確字段有的時候可能會崩潰,但是服務器還不是說一次就改好了,往往需要改好多次,在php改好之前,每次測試一次崩潰一次,然后在重新跑模擬器,時間都這樣浪費了。
解決方案:charles抓包模擬重新發送,charles能夠做的不僅僅如此,還能夠模擬服務器返回數據,模擬網速異常等等,比如可以右鍵進行編輯或者重復,保存請求或者響應,非常方便。在服務器大幅度調整的時候用來和服務器一起測試,效率提升了很多。
MVC開發需要根據服務器返回的字段建立模型
開發中經常需要根據服務器返回的json數據建立模型,然后再客戶端實現所需要的功能,但是如果返回的字段很短,每次都手動編寫實在是浪費時間。比如過去有段時間特別忙,字段經常增刪改。后來網上發現了個可以自動提取JSON數據,自動生成模型代碼的工具,支持OC和swift真是再方便不過了。
https://github.com/netyouli/WHC_Model
UI布局復雜,層次關系不清楚
雖然Xcode已經提供了可以查看UI層次結構的調試功能,可以逐層查看,輸出具體UI的大小和類別,但是有的時候還是滿足不了需求,比如有些UI元素是可能出現可能不出現的,在公司的app里面題目展示的界面UI就比較復雜,曾經有個bug就是有些大圖點擊不了,明明加手勢了就是沒有響應,看代碼根本看不下去,因為約束關系太復雜了,原來的哥們不熟悉scrollview,約束設置錯誤,導致某個ImageView的父視圖寬度為0了。
解決方案:當時自己是通過給所有的視圖增加隨機顏色然后發現問題的.同樣用的還是遞歸
-(void)debug:(UIView * )view
{
if (view.subviews.count==0) {
return;
}
else{
for (UIView * sub in view.subviews) {
sub.backgroundColor = [UIColor colorWithRed:arc4random()%255/255.0 green:arc4random()%255/255.0 blue:arc4random()%255/255.0 alpha:1];
[self debug:sub];
}
}
}