💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
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,默认是没有开启的,因此一旦图片加载失败,就不会再重试。需要把这个选项打开。