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,默认是没有开启的,因此一旦图片加载失败,就不会再重试。需要把这个选项打开。