上周公众号发布的以下文章:
本期知识小集的主要内容包括:
- 用 NSDecimalNumber 处理 iOS 中的货币金额
- 如何更容易看懂宏
- Storyboard/Xib 颜色空间的坑
- VC 多层 push 后回到指定页面的几种方法
- 添加沙箱技术测试员报错的问题
- UIViewController 设置导航栏和标签栏不同 title 的问题
- 苹果官方类库中 NSDateFormatter 的小 bug
用 NSDecimalNumber 处理 iOS 中的货币金额
作者 : halohily
在iOS开发中,经常遇到货币金额的表示与计算,你可能会使用 double 或 float 这样的浮点数,也可能使用 NSString 。无论用哪个,都需要再编写繁琐的精度控制、小数位数控制等代码。其实,苹果为我们提供了一个标准类
NSDecimalNumber
来处理这样的需求。
NSDecimalNumber 是 NSNumber 的子类,它提供了完善的初始化方法。对于令人头疼的金额计算,它还提供了贴心的加、减、乘、除运算方法。在进行这些运算的时候,你还可以通过 NSDecimalNumberHandler 对象来对运算的处理策略进行设置,比如舍入模式的选择,数据溢出、除零等异常情况的处理等。
下次遇到货币金额的需求,不妨了解一下 NSDecimalNumber。
参考资料:
-
iOS 数字精准计算之NSDecimalNumber
https://www.jianshu.com/p/ea4da259a062
-
NSDecimalNumber数字精确
https://www.jianshu.com/p/25d24a184016
如何更容易看懂宏
作者 : Lefe_x
相信你和我一样,也遇到过特别难理解的宏定义,比如宏与宏之间嵌套、带参数的宏。我们看个例子(这个宏并不是特别难,但也很绕):
#define JPBOXING_GEN(_name, _prop, _type) \
+ (instancetype)_name:(_type)obj \
{ \
JPBoxing *boxing = [[JPBoxing alloc] init]; \
boxing._prop = obj; \
return boxing; \
}
JPBOXING_GEN(boxObj, obj, id)
复制代码
这个例子看着总是怪怪的,如果把上面的宏转换成实际代码,相信你会很容易看懂。
+ (instancetype)boxObj:(id)obj
{
JPBoxing *boxing = [[JPBoxing alloc] init];
boxing.obj = obj;
return boxing;
}
复制代码
其实就是各种参数的替换导致阅读起来比较困难。我们都知道程序经过预处理后就会把宏转换为实际的代码,而 Xcode 为我们提供了对单个文件进行预处理(Produce -> Perform Action -> Preprocess 'xxxx.m'),这样处理后,上面的宏就变成了:
+ (instancetype)boxObj:(id)obj {
JPBoxing *boxing = [[JPBoxing alloc] init];
boxing.obj = obj;
return boxing;
}
复制代码
经过预处理后和我们手动翻译的结果一样。
Storyboard/Xib 颜色空间的坑
作者 : Vong_HUST
今天分享一下
Xcode Interface Builder
设置背景色的一个坑。从
Xcode8
起,
Xib/Storyboard
里的颜色空间默认从
Generic RGB
换成了
sRGB
,但又不是所有的都会转换,很奇怪。所以当时在适配
Xcode8
的时候,颜色空间都统一全局替换了一遍。最近又遇到一次这个坑,在
Storyboard
把某个视图背景色从白色更改为
0xf0f1f2
,然后 run 起来,和其
superview
(
superview
的背景色是用代码设置的
0xf0f1f2
)竟然有一个明显的分割线,所以回想起当时适配时的这个问题,然后取到
Storyboard
里面一看,果然是颜色空间被莫名改为了
Generic RGB
,如图所示。所以手动改变其颜色空间为
sRGB
即可。
参考链接
-
Xcode Interface Builder 指定顏色與實際有出入
http://t.cn/RgpFOPg
-
WWDC Working with Wide Color
http://t.cn/ReADdu7
VC 多层 push 后回到指定页面的几种方法
作者 : 这个汤圆没有馅
场景如下: RootVC -- > A -- > B -- > C,然后现在要求C直接pop回到A。
方法一:C返回到B的时候写个回调,B接收到回调再自己pop到A,但是这个方法B的页面会闪现一下,用户体验不好,不推荐。
方法二:在B push 到C的时候,直接把B从导航控制器的堆栈中移除,如图一。
方法三:写一个UIViewController的catrgory,方法实现如图二。在C的backAct方法中使用,如图三。有的同学可能会怀疑B会不会内存泄露,可以在B中打印dealloc。
这里比较推荐方法三。不论有多少级的push,只要传入指定页面的类名,都能回到该页面。
添加沙箱技术测试员报错的问题
作者 : 高老师很忙
在测试 IAP 的时候需要添加沙箱技术测试员,相当于创建一个虚拟的 AppleID,填写的邮箱是不能写真实 AppleID 邮箱的,要不然就会报错,可以随意写一个不存在的邮箱,为了方便,创建一个简短的密码就会报错误:
按照提示改好后,依然报错:
并且没有任何的提示,感觉这点好坑,尝试了N遍之后发现是密码的复杂度不够,要包含大小写和数字,虽然是虚拟的 AppleID,但是密码规则要和正式的 AppleID 一样,希望以后苹果把错误提示做的更好吧!😂
UIViewController 设置导航栏和标签栏不同 title 的问题
作者 : KANGZUBIN