提示
此功能在 5.12.0 版本开始支持。
好友列表页面
好友列表页面展示了当前用户设备上的所有好友。进入该页面,SDK 就会从数据库中拉取好友信息,并按照好友的名称(如果有备注名, 优先使用备注名)索引排序。IMKit 提供基于 UIKit UITableView
的好友页面类 RCFriendListViewController
。
好友列表页面
好友列表页面一般由导 航栏,搜索栏和好友列表三部分部分组成,其中好友列表第一个 section 支持用户自定义功能,例如“新的朋友”,“当前用户”等功能。
初始化
调用 RCFriendListViewController
类的初始化方法构建好友列表页面。注意,您需要创建一个 RCFriendListViewModel
对象, 作为RCFriendListViewController
的业务逻辑处理模块。
RCFriendListViewModel *viewModel = [[RCFriendListViewModel alloc] init];
RCFriendListViewController *contactVC = [[RCFriendListViewController alloc] initWithViewModel:viewModel];
[self.navigationController pushViewController:contactVC animated:YES];
参数 | 类型 | 说明 |
---|---|---|
viewModel | RCFriendListViewModel | RCFriendListViewController 的业务逻辑处理模块。 处理页面UI的配置以及好友信息的拉取。 |
定制化
IMKit 好友列表界面的样式可供自定义修改。
标题栏
IMKit 的 RCFriendListViewController
使用了系统的导航栏,可用于显示好友列表的标题,用户通过继承RCFriendListViewController
,在 viewDidLoad
方法中通过 title
属性设置标题。
- (void)viewDidLoad {
[super viewDidLoad];
self.title = @"新标题";
}
搜索框
RCFriendListViewController
搜索默认是搜索好友,通过设置 RCFriendListViewModel
的 delegate
属性, 实现相关代理方法 ,自定义搜索功能。
RCFriendListViewModel *viewModel = [[RCFriendListViewModel alloc] init];
viewModel.delegate = self;
RCFriendListViewController *contactVC = [[RCFriendListViewController alloc] initWithViewModel:viewModel];
[self.navigationController pushViewController:contactVC animated:YES];
...
/// 配置自定义的搜索功能
- (RCSearchBarViewModel *_Nullable)willConfigureSearchBarViewModelForFriendListViewModel:(RCFriendListViewModel *)viewModel {
//返回自定义的搜索 ViewModel
}
...
### 自定义 Cell
#### 1. 自定义 RCCustomCell
```objectivec
@interface RCCustomCell : UITableViewCell
@property (nonatomic, strong) UILabel *titleLabel;
@property (nonatomic, strong) UILabel *contentLabel;
@end
@implementation
// Cell 绘制
@end
2.自定义 RCCustomCellViewModel
提示
RCFriendListCellViewModel 可以Cell的创建, 自定义 CellViewModel 需要继承该类
typedef void(^RCPermanentCellViewModelBlock)(UIViewController *);
@interface RCCustomCellViewModel : RCFriendListCellViewModel
/// 初始化
- (instancetype)initWithTitle:(NSString *)title
portrait:(UIImage *)portrait
touchBlock:(RCPermanentCellViewModelBlock)touchBlock;
@property (nonatomic, copy) NSString *title;
@property (nonatomic, strong) UIImage *portrait;
@property (nonatomic, copy) RCPermanentCellViewModelBlock touchBlock;
@end
@implementation RCCustomCellViewModel
- (instancetype)initWithTitle:(NSString *)title
portrait:(UIImage *)portrait
touchBlock:(RCPermanentCellViewModelBlock)touchBlock{
self = [super init];
if (self) {
self.title = title;
self.portrait = portrait;
self.touchBlock = touchBlock;
}
return self;
}
// 注册并自定义cell
- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath {
NSString *cellIdentifier = @"RCCustomCellIdentifier";
// 注册 cell
[tableView registerClass:RCCustomCell.class forCellReuseIdentifier:cellIdentifier];
// 返回 cell
RCCustomCellViewModel *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (!cell) {
cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
}
//修改UI
cell.titleLabel.text = self.title;
cell.contentLabel.text = self.detail;
return cell;
}
@end
3. 添加代理
初始化时设置 RCFriendListViewModel
代理:
RCFriendListViewModel *viewModel = [[RCFriendListViewModel alloc] init];
viewModel.delegate = self;
4. 修改数据源
实现代理方法:
// 好友数据源
- (NSArray *_Nullable)friendListViewModel:(RCFriendListViewModel *)viewModel
willLoadItemsInDataSource:(NSArray *_Nullable)dataSource {
// 对数据源增删改处理
}
// section == 1 时常驻 cell 数据源
- (NSArray <RCFriendListPermanentCellViewModel *>*_Nullable)appendPermanentCellViewModelsForFriendListViewModel:(RCFriendListViewModel *)viewModel {
NSMutableArray *list = dataSource.mutableCopy;
RCCustomCellViewModel *customCellVM = [[RCCustomCellViewModel alloc] initWithTitle:@"title" portrait:[UIImage imageNamed:@"newFriend"] touchBlock:^(UIViewController * vc) {
// 点击事件
}];
[list addObject:@[customCellVM]];
return list;
}
5.点击 cell
/// 配置自定义点击事件,Returns: App是否处理[YES : SDK不再处理, NO: SDK处理]
- (BOOL)friendListViewModel:(RCFriendListViewModel *)viewModel
viewController:(UIViewController*)viewController
tableView:(UITableView *)tableView
didSelectRow:(NSIndexPath *)indexPath
cellViewModel:(RCBaseCellViewModel *)cellViewModel {
}