Skip to content

Latest commit

 

History

History
134 lines (94 loc) · 6.65 KB

1.5.0版本迁移指南.md

File metadata and controls

134 lines (94 loc) · 6.65 KB

1.5版本迁移指南

JXCategoryListContainerView的初始化方法更改

旧版本代码:

self.listContainerView = [[JXCategoryListContainerView alloc] initWithDelegate:self];

新版本代码:

self.listContainerView = [[JXCategoryListContainerView alloc] initWithType:JXCategoryListContainerType_ScrollView delegate:self];

删除了JXCategoryListCollectionContainerView

请使用JXCategoryListContainerView类,初始化的时候给type赋值JXCategoryListContainerType_CollectionView,就相当于使用了以前的JXCategoryListCollectionContainerView了。

对于JXCategoryBaseView,使用listContainer替换contentScrollView

删除以下代码:

self.categoryView.contentScrollView = self.listContainerView.scrollView;

更换为一下代码:

self.listContainerView = [[JXCategoryListContainerView alloc] initWithType:JXCategoryListContainerType_ScrollView delegate:self];
self.categoryView.listContainer = self.listContainerView;

删除didClickSelectedItemAtIndexscrollingFromLeftIndex代理方法的传递调用

删除如下代码:

#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之前版本那样,必须自己手动调用。

设置defaultSelectedIndex属性更改

老版本代码:

self.categoryView.defaultSelectedIndex = 1;
self.listContainerView.defaultSelectedIndex = 1;

新版本代码:

self.categoryView.defaultSelectedIndex = 1;

只需要设置categoryViewdefaultSelectedIndex即可,内部会自动同步给listContainerView了。

调用reloadData方法更改

老版本代码:

[self.categoryView reloadData];
[self.listContainerView reloadData];

新版本代码:

[self.categoryView reloadData];

只需要调用categoryViewreloadData即可,内部会自动同步调用listContainerViewreloadData

新增reloadDataWithoutListContainer方法

reloadDataWithoutListContainerreloadData相比,只是reloadDataWithoutListContainer方法内部没有调用[self.listContainer reloadData];方法。用于只是想刷新JXCategoryView的UI的情况,比如刷新cell上的数字、红点等,而不需要刷新列表容器。

删除addChildViewController方法

因为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;
}

列表是UIViewController类可以删除自定义的naviController属性

因为JXCategoryListContainerView视图内部自己创建了一个JXCategoryListContainerViewController视图控制器。并且该控制器检测到列表是VC类的时候,会调用addChildViewController方法,将列表VC加入到层级里面。这样列表VC可以直接使用self.navigationController,而无需让外部传入导航栏控制器。

当然如果你的列表是视图,也还是要保持以前传递导航栏控制器给列表视图的逻辑。

1.5.0版本更新总结

JXCategoryView已经开源1年半有余,截至目前已经累计获取3800stars。证明整个库的设计与定位还是比较成功的,受到了大家的认可。但是随着用的人越多,大家对JXCategoryView提出了更高的要求。支持更多的特性、API更加简洁、类的封装更加成熟,使用更加便捷。

因为对JXCategoryView的定位是分类选择器,所以,最开始都没有JXCategoryListContainerView类来做列表的管理。后来大家反馈列表的管理不是很方便,尤其对于刚入门的朋友,总是会犯一些错误。所以,后面才加入了JXCategoryListContainerView封装了列表的管理。但是,因为不想让JXCategoryListContainerViewJXCategoryView强耦合,就设计了一个contentScrollView属性,通过KVO contentoffset属性,达到联动效果。代码如下:

self.categoryView.contentScrollView = self.listContainerView.scrollView;

但是,后面大家对于列表的生命周期有更高的要求,所以,就新增了didClickSelectedItemAtIndexscrollingFromLeftIndex代理方法的传递调用。并且defaultSelectedIndex属性和reloadData方法,JXCategoryViewJXCategoryListContainerView是分开管理的。所以,就存在许多冗余的调用。

为了让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,然后就无需关心他们之间的交互了。