We grow neither better nor worse as we grow old but more like ourselves.( M. L. Becker )
随着年龄的增长,我们并没有变得更好也没有变得更坏,而是变得更象我们自己(贝克尔)
下载地址:Github
层级说明:
此控件为UIView,分三个部分,顶部为headerView,setter方法设置,中间的title视图为可以滚动的scrollView,可以设置标题选择和未选择的颜色,底部为collectionView嵌套的tableView,而tableView为用户注册的类名加载而来,需要继承HHBaseTableView
,重写父类的一些方法,用户只需要管理headerView和tableView即可,详见Demo
.
该视图包含三个小模块:
- BaseConstruct :可选8中waitHud样式,提醒文字,错误页面;
- RefreshManager :包含三种刷新样式,KVO监听,使用简单;
- LinkageView :指示器联动
传值:
-
事件传递 :
传值方式为:KVC字典传值,控制器定义Block
,以key
值区分事件,保存在HHHoverLinkageView
的actionDict
中,父视图负责分发到各个子视图,子视图各个以key
值获得自己需要调用的Blcok。
@property (nonatomic, strong) NSMutableDictionary *actionDict;//存储block,给子视图传递事件
AddBlockAction(_hoverView.actionDict, HeaderViewButtonClick, ^(NSString *text){
[wSelf showText:text];
});
-
值传递 :
主视图中暴露了二个属性,用户根据需要设置数据
@property (nonatomic, copy) NSDictionary *dataDict;//需要传递给子视图tableView的字典
@property (nonatomic, copy) NSArray *dataArray;//需要传递给子视图tableView的数组
用户自定义的tableView只需要重写下面方法即可获得数据
@property (nonatomic, copy) NSDictionary *dataDict;//子类重写 "setter" 获得数据
@property (nonatomic, copy) NSArray *dataArray;//子类重写 "setter" 获得数据
@property (nonatomic, strong) NSIndexPath *indexPath;//子类重写"setter" 获得索引
常用方法:
_hoverView.linkageView.titleArray = self.titleArray;//决定中间title的标题
_hoverView.tableViewClassName = NSStringFromClass([HHHoverTableView class]);//注册类名需要继承"HHBaseTableView",加载用户自定义的tableView
知识点:
-
1 :
tableView
的contentOffset
实际上就是它的bounds
,只需要在scrollViewDidScroll
中时时改变为0,即是:scrollView.contentOffset = CGPointZero
就可以控制它父视图的坐标,同时加上一系列的边界监测,就可实现上述效果。 -
2 :关键字
copy
、assign
、weak
和strong
的灵活运用
对于以下两种是没有太多意义的,每次赋值都会copy
一个不可变对象设置属性,如果使用插入删除编译时不会报错,但运行时会导致崩溃。
@property (nonatomic, copy) NSMutableDictionary *dictM;
@property (nonatomic, copy) NSMutableArray *arrayM;
对于以下类型的属性,非一致类型,都会拷贝copy
一个不可变对象设置属性,否则直接引用
@property (nonatomic, copy) NSDictionary *dict;
@property (nonatomic, copy) NSArray *array;
copy
相对于strong
它是安全的,strong
为引用性,指针可指向任意对象,造成不安全的访问。
weak
和assign
一个对象销毁时自动赋值nil
,一个不会。一般对象解循环引用的时候用weak
,而assign
常用语基础类型。下面举一个assign
不常用到的例子,也是在写此Demo
中遇到的。
A对象是一个视图,拥有子视图属性B,子视图B拥有对象属性C,C通过KVO监听B属性的变化。为了保持解耦合,我把B传入C,Cweak
引用B设为自己的属性D,在Cdealloc
中,让D移除观察者C。
原则上看是没有任何问题的,实际在演示中发现,B视图会先销毁,而后C才会销毁,当B销毁后,C的属性D也会指向
nil
,在Cdealloc
中,无法移除观察者,导致程序崩溃,此时用assign
,却能解决这个问题,虽然B销毁了,C依然可以拿到地址,移除观察者,正常销毁。最后:
由于本人目前知识储备有限,以上说明中,也许会存在一些错误的描述和认识,还希望发现后你能及时指出,以免误导其他读者,在此谢过。
网友评论