旧版本代码:
self.listContainerView = [[JXCategoryListContainerView alloc] initWithDelegate:self];
新版本代码:
self.listContainerView = [[JXCategoryListContainerView alloc] initWithType:JXCategoryListContainerType_ScrollView delegate:self];
请使用JXCategoryListContainerView
类,初始化的时候给type赋值JXCategoryListContainerType_CollectionView
,就相当于使用了以前的JXCategoryListCollectionContainerView
了。
删除以下代码:
self.categoryView.contentScrollView = self.listContainerView.scrollView;
更换为一下代码:
self.listContainerView = [[JXCategoryListContainerView alloc] initWithType:JXCategoryListContainerType_ScrollView delegate:self];
self.categoryView.listContainer = self.listContainerView;
删除如下代码:
#pragma mark - JXCategoryViewDelegate
- (void)categoryView:(JXCategoryBaseView *)categoryView didClickSelectedItemAtIndex:(NSInteger)index {
[self.listContainerView didClickSelectedItemAtIndex:index];
}
- (void)categoryView:(JXCategoryBaseView *)categoryView scrollingFromLeftIndex:(NSInteger)leftIndex toRightIndex:(NSInteger)rightIndex ratio:(CGFloat)ratio {
[self.listContainerView scrollingFromLeftIndex:leftIndex toRightIndex:rightIndex ratio:ratio selectedIndex:categoryView.selectedIndex];
}
因为listContainer
已经在JXCategoryBaseView
内部进行自动调用了。不用像1.5.0之前版本那样,必须自己手动调用。
老版本代码:
self.categoryView.defaultSelectedIndex = 1;
self.listContainerView.defaultSelectedIndex = 1;
新版本代码:
self.categoryView.defaultSelectedIndex = 1;
只需要设置categoryView
的defaultSelectedIndex
即可,内部会自动同步给listContainerView
了。
老版本代码:
[self.categoryView reloadData];
[self.listContainerView reloadData];
新版本代码:
[self.categoryView reloadData];
只需要调用categoryView
的reloadData
即可,内部会自动同步调用listContainerView
的reloadData
reloadDataWithoutListContainer
与reloadData
相比,只是reloadDataWithoutListContainer
方法内部没有调用[self.listContainer reloadData];
方法。用于只是想刷新JXCategoryView
的UI的情况,比如刷新cell上的数字、红点等,而不需要刷新列表容器。
因为JXCategoryListContainerView
视图内部自己创建了一个JXCategoryListContainerViewController
视图控制器,用于管理所有的列表生命周期。所以,外部无需再对列表VC调用addChildViewController
方法。
- (id<JXCategoryListContentViewDelegate>)listContainerView:(JXCategoryListContainerView *)listContainerView initListForIndex:(NSInteger)index {
LoadDataListContainerListViewController *listVC = [[LoadDataListContainerListViewController alloc] init];
//⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️删除`addChildViewController,因为内部的JXCategoryListContainerViewController已经对列表VC进行了addChild操作,如果这里在addChild,会导致崩溃。`⚠️⚠️⚠️⚠️⚠️⚠️⚠️
//[self addChildViewController:listVC];
listVC.title = self.titles[index];
return listVC;
}
因为JXCategoryListContainerView
视图内部自己创建了一个JXCategoryListContainerViewController
视图控制器。并且该控制器检测到列表是VC类的时候,会调用addChildViewController
方法,将列表VC加入到层级里面。这样列表VC可以直接使用self.navigationController
,而无需让外部传入导航栏控制器。
当然如果你的列表是视图,也还是要保持以前传递导航栏控制器给列表视图的逻辑。
JXCategoryView
已经开源1年半有余,截至目前已经累计获取3800stars。证明整个库的设计与定位还是比较成功的,受到了大家的认可。但是随着用的人越多,大家对JXCategoryView
提出了更高的要求。支持更多的特性、API更加简洁、类的封装更加成熟,使用更加便捷。
因为对JXCategoryView
的定位是分类选择器,所以,最开始都没有JXCategoryListContainerView
类来做列表的管理。后来大家反馈列表的管理不是很方便,尤其对于刚入门的朋友,总是会犯一些错误。所以,后面才加入了JXCategoryListContainerView
封装了列表的管理。但是,因为不想让JXCategoryListContainerView
和JXCategoryView
强耦合,就设计了一个contentScrollView
属性,通过KVO contentoffset
属性,达到联动效果。代码如下:
self.categoryView.contentScrollView = self.listContainerView.scrollView;
但是,后面大家对于列表的生命周期有更高的要求,所以,就新增了didClickSelectedItemAtIndex
和scrollingFromLeftIndex
代理方法的传递调用。并且defaultSelectedIndex
属性和reloadData
方法,JXCategoryView
和JXCategoryListContainerView
是分开管理的。所以,就存在许多冗余的调用。
为了让JXCategoryView
和列表容器有更好的互动,就新增了如下属性:
@property (nonatomic, weak) id<JXCategoryViewListContainer> listContainer;
通过协议JXCategoryViewListContainer
来完成联动,而不是具体类,达到一定程度的解耦效果。
所以,最终的效果就是JXCategoryView
和列表容器有了更好的定位,两者一起使用更加简洁。最终的效果如下:
//JXCategoryListContainerView需要先初始化,然后赋值给categoryView,这样defaultSelectedIndex属性的设置,才能成功同步到JXCategoryListContainerView
self.listContainerView = [[JXCategoryListContainerView alloc] initWithType:JXCategoryListContainerType_ScrollView delegate:self];
[self.view addSubview:self.listContainerView];
self.categoryView = [[JXCategoryTitleView alloc] init];
self.categoryView.listContainer = self.listContainerView;
[self.view addSubview:self.categoryView];
你需要初始化JXCategoryListContainerView
,并赋值给listContainer
,然后就无需关心他们之间的交互了。