1、Xcode8日志及Pod的Swift3.0问题
2、UITextFiled使用UITextAlignmentRight输入空格光标不实时跟进
3、解决使用UIAlertController时,Attempt to present vc whose view is not in the window hierarchy! 问题
4、单例在 Unit Test 中不唯一问题
Xcode8日志及Pod的Swift3.0问题
目前的Xcode8会打印多余的日志,需要进入对应scheme中的enviroment variables设置下:
1 | OS_ACTIVITY_MODE disable |
如果设置了以上信息后,出现了真机调试不会打印日志的情况的话,去掉disable
,保留OS_ACTIVITY_MODE
。
Pod更新Swift三方库后编译,会出现转换语法的错误,需要在podfile中添加以下语句再更新:
1 | post_install do |installer| |
如果还想使用2.3的话:
1 | post_install do |installer| |
UITextFiled使用UITextAlignmentRight输入空格光标不实时跟进
在上图箭头处输入空格,光标和文字不会向前移动。
解决使用UIAlertController时,Attempt to present vc whose view is not in the window hierarchy! 问题
假设现有有控制器 A , present 了控制器 B ,而在控制器 B 还没有 dimiss 完全时,再 present 新的控制器 C 就会出现这个警告,控制器 C 也并不会如预期显示。
把上面的控制器 C 当成 UIAlertController ,就切合某些业务场景了。 结合业务场景,这个问题可以看成:如何让UIAlertController 使用起来和 UIAlertView 一样“万金油” ,并且不用受控制器层级约束。
下面是 stackoverflow 上一个比较详细的解决方案:
How to present UIAlertController when not in a ViewController
简单来说,就是创建一个新的 window ( 优先级比当前最高优先级大 1 ), 然后通过这个 window 的根控制器 present UIAlertController,并且在 UIAlertController 被释放的同时,释放此 window。
这个方案本身目前看来并没有问题,问题出现 agilityvision 在 stackoverflow 上给的 demo 多了下面代码 (FFGlobalAlertController 并没有这几句代码):
1 | if ([delegate respondsToSelector:@selector(window)]) { |
上面代码在以下情况下,存在 alert 按钮文字无法显示的问题 :
- 设置 -> 通用 -> 辅助功能 -> 增强对比度 -> 打开加深颜色 。
这个问题挺奇葩的,要不是刚好有测试人员打开了这个开关,基本也发现不了。最终我也不知道为什么会这样,从 Xcode 可视化工具看, alert 按钮上的确是有文字的,颜色也没错。
想要使用 agilityvision 的方案,删除这几句代码就可以不会出现上述问题了。
单例在 Unit Test 中不唯一问题
项目中有两个 Target ,一个 Framework ,一个 Test ,不过 Podfile 只是指定了 Framework 的依赖,并没有像下面那样给 Test 设置依赖(或者继承主 Target):
1 | target 'XXXTests' do |
这样在运行单元测试的时候,会出现 Undefined 编译错误。如果强制在 Configurations 中设置 Test 的配置和 Framework 一致,会造成工程里实际存在了两个单例类,单例对象实际上并不唯一。
这种情况下,只要像上面演示的那样,给 Test 设置单独的依赖即可,一般为空即可。参考 iOS Testing: dispatch_once get called twice. First in App, second in Test. Problems with Observers