获取当前控制器
感觉这个功能很有用,尤其有这样需求的时候: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];
}
}
}
网友评论