tableHeaderView从xib加载时frame设置问题
tableView
的tableHeaderView
从xib加载时,使用xib加载的默认尺寸,而不设置frame。当tableView
还有个sectionHeader
时,tableHeaderView
在iOS12上显示正常,但在iOS10、11中,tableHeaderView
会覆盖cell,并且sectionHeader
会显示在tableView
的最上面。而给tableViewHeader
视图设置frame时,小屏幕上往往要设置远大于实际需要高度才能正常显示。
Carthage引入RxSwift后运行报错
使用carthage引入RxSwift之后,运行报错:
1 | dyld: Library not loaded: @rpath/XCTest.framework/XCTest |
解决方法:
Swift函数类型和闭包
TableView中重用TextField的问题
在开发项目中,经常会遇到多输入框页面,如果输入框样式一致或者差异较小,就可以采用tableView
来实现。但是在tableView
中重用textField
会产生两个问题:一个是键盘弹出后textField
怎样保持在键盘上方,另一个是textField
滑动后会丢失输入数据或者输入数据错乱。其实还有一个附加问题:在使用tableView
的页面如何收起键盘?
问题1:键盘弹起后,textField
怎样才能保持在键盘上方呢,一般的方式是通过监听键盘弹出和收起的通知来改变tableView
的contentOffset
,一个更简单的方式是:
Swift之字符串处理
data
和string
互转:1
2
3
4// data转string
let string = String(data:data,encoding:.utf8)
// string转data
let data = myString.data(using:.utf8)json数据中的日期格式处理
Swift中defer的使用
defer基本理解
在Swift中,defer所声明的block会在当前代码执行退出后被调用。正因为它提供了一种延时调用的方式,所以一般会被用来做资源释放或者销毁,这在某个函数有多个返回出口的时候特别有用。
示例:
1 | func operateOnFile(descriptor: Int32) { |
需要特别注意的是defer
的作用域。
iOS之__bridge / __bridge_retained / __bridge_transfer
__bridge
, __bridge_retianed
和 __bridge_transfer
用来处理OC对象和CF对象的转换。
转换规则:
__bridge
:只转换对象类型,不涉及对象所有权的转换(不增加对象引用计数);容易造成悬垂指针。- 悬垂指针:指针指向的内存已经被释放;
- 野指针:没有被正确初始化的指针,指向内存中随机的位置;
__bridge_retained
:OC对象转换成CF对象,OC对象所有权交给CF对象(CF指针也会持有对象),CF对象需要自己管理内存。__bridge_transfer
:CF对象转换成OC对象,将CF对象所有权交给OC对象(CF指针不再持有对象),ARC自动管理内存。
ARC环境下编译器会自动管理OC对象的内存,但是不会自动管理CF对象的内存。
CF对象需要手动释放。
__bridge
示例:
1 | id obj = [[NSObject alloc] init]; |
__bridge_retained
示例:
1 | void *pointer = NULL; |
__bridge_transfer
示例:
1 | void *pointer = NULL; |
一些UI设置总结
一个视图既要圆角又要阴影效果
因为设置圆角需要设置maskToBounds为YES,而要设置阴影则maskToBounds为NO,二者不可兼得
解决方法:
- A为父视图,B为子视图,设置B与A的约束边距都为0;
- 设置A的背景色为clearColor,设置A的阴影效果
- 设置B的背景色为视图实际背景色,设置B的圆角
另外发现一种更简单的方式:
需要设置UIView.layer.masksToBounds = NO并且设置UIView.layer.borderWidth = CGFLOAT_MIN即可,某些自定义view在这样设置之后如果仍然无法实现,尝试下设置背景色即可。
convertRect的正确使用
Swift中的元类型:.Type与.self
元类型
元类型就是类型的类型。元类型表述为metaType
。
.Type和.self
Swift中元类型用.Type
表示。比如Int.Type
就是Int
的元类型。
类型和值有着不同的形式,比如说5是个Int
类型的值。
.Type
是类型的元类型;类型的.self
是元类型的值,也就是类型本身。
1 | let metaTypeValue: Int.Type = Int.self |
元类型在Swift中的应用
在Swift中,获得元类型后可以访问静态变量和静态方法。我们经常使用元类型,比如在tableView
中的AnyClass
:
1 | func register(AnyClass?, forCellReuseIdentifier: String) |
AnyClass
就是一个任意类型元类型的别名。