NIMNormalTeamCardViewController.m 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592
  1. //
  2. // NTESNormalTeamCardViewController.m
  3. // NIM
  4. //
  5. // Created by chris on 15/3/10.
  6. // Copyright (c) 2015年 Netease. All rights reserved.
  7. //
  8. #import <NIMSDK/NIMSDK.h>
  9. #import "NIMNormalTeamCardViewController.h"
  10. #import "NIMCardMemberItem.h"
  11. #import "NIMTeamCardOperationItem.h"
  12. #import "NIMKitDependency.h"
  13. #import "NIMTeamCardRowItem.h"
  14. #import "NIMTeamCardHeaderCell.h"
  15. #import "NIMTeamMemberCardViewController.h"
  16. #import "NIMUsrInfoData.h"
  17. #import "UIView+NIM.h"
  18. #import "NIMMemberGroupView.h"
  19. #import "NIMKitColorButtonCell.h"
  20. #import "NIMTeamSwitchTableViewCell.h"
  21. #import "NIMContactSelectConfig.h"
  22. #import "NIMContactSelectViewController.h"
  23. #import "NIMGlobalMacro.h"
  24. #import "NIMKitProgressHUD.h"
  25. #define TableCellReuseId @"tableCell"
  26. #define TableButtonCellReuseId @"tableButtonCell"
  27. #define TableSwitchReuseId @"tableSwitchReuseId"
  28. #define TableSepTag 10001
  29. @interface NIMNormalTeamCardViewController ()<NIMTeamManagerDelegate, NIMTeamMemberCardActionDelegate,UITableViewDataSource,UITableViewDelegate,NIMTeamSwitchProtocol,NIMContactSelectDelegate,NIMMemberGroupViewDelegate>{
  30. UIAlertView *_updateTeamNameAlertView;
  31. UIAlertView *_quitTeamAlertView;
  32. }
  33. @property (nonatomic,strong) NIMTeamMember *myTeamInfo;
  34. @property (nonatomic,strong) NIMTeam *team;
  35. @property (nonatomic,copy) NSArray *teamMembers;
  36. @property (nonatomic,strong) NIMMemberGroupView *headerView;
  37. @property (nonatomic,strong) UITableView *tableView;
  38. @property (nonatomic,assign) NIMKitCardHeaderOpeator currentOpera;
  39. @property (nonatomic,strong) NSMutableArray *headerData; //表头collectionView数据
  40. @property (nonatomic,strong) NSArray *bodyData; //表身数据
  41. @end
  42. @implementation NIMNormalTeamCardViewController
  43. - (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil{
  44. self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
  45. if (self) {
  46. [[NIMSDK sharedSDK].teamManager addDelegate:self];
  47. }
  48. return self;
  49. }
  50. - (instancetype)initWithTeam:(NIMTeam *)team{
  51. self = [self initWithNibName:nil bundle:nil];
  52. if (self) {
  53. _team = team;
  54. }
  55. return self;
  56. }
  57. - (void)dealloc{
  58. [[NIMSDK sharedSDK].teamManager removeDelegate:self];
  59. }
  60. - (void)viewDidLoad {
  61. [super viewDidLoad];
  62. self.tableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain];
  63. self.tableView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
  64. self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
  65. self.tableView.backgroundColor = NIMKit_UIColorFromRGB(0xecf1f5);
  66. if (@available(iOS 15.0, *)) {
  67. self.tableView.sectionHeaderTopPadding = 0;
  68. }
  69. [self.view addSubview:self.tableView];
  70. __weak typeof(self) wself = self;
  71. [self requestData:^(NSError *error, NSArray *data) {
  72. if (!error) {
  73. [wself refreshWithMembers:data];
  74. }else{
  75. [wself.view makeToast:@"讨论组成员获取失败"];
  76. }
  77. }];
  78. }
  79. - (void)viewDidLayoutSubviews{
  80. [self refreshTableHeader:self.view.nim_width];
  81. }
  82. - (NSString*)title{
  83. return self.team.teamName;
  84. }
  85. #pragma mark - Data
  86. - (void)requestData:(void(^)(NSError *error,NSArray *data)) handler{
  87. __weak typeof(self) wself = self;
  88. [[NIMSDK sharedSDK].teamManager fetchTeamMembers:self.team.teamId completion:^(NSError *error, NSArray *members) {
  89. NSMutableArray *array = nil;
  90. if (!error) {
  91. NSString *myAccount = [[NIMSDK sharedSDK].loginManager currentAccount];
  92. for (NIMTeamMember *item in members) {
  93. if ([item.userId isEqualToString:myAccount]) {
  94. wself.myTeamInfo = item;
  95. }
  96. }
  97. array = [[NSMutableArray alloc]init];
  98. for (NIMTeamMember *member in members) {
  99. NIMTeamCardMemberItem *item = [[NIMTeamCardMemberItem alloc] initWithMember:member];
  100. [array addObject:item];
  101. }
  102. wself.teamMembers = members;
  103. }else if(error.code == NIMRemoteErrorCodeTeamNotMember){
  104. [wself.view makeToast:@"你已经不在讨论组里"];
  105. }else{
  106. [wself.view makeToast:@"拉好友失败"];
  107. }
  108. handler(error,array);
  109. }];
  110. }
  111. - (NSArray*)buildBodyData{
  112. NIMTeamCardRowItem *itemName = [[NIMTeamCardRowItem alloc] init];
  113. itemName.title = @"讨论组名称";
  114. itemName.subTitle = self.team.teamName;
  115. itemName.action = @selector(updateTeamInfoName);
  116. itemName.rowHeight = 50.f;
  117. itemName.type = TeamCardRowItemTypeCommon;
  118. NIMTeamCardRowItem *teamNotify = [[NIMTeamCardRowItem alloc] init];
  119. teamNotify.title = @"消息提醒";
  120. //普通群没有只接受管理员
  121. teamNotify.switchOn = [self.team notifyStateForNewMsg] == NIMTeamNotifyStateAll;
  122. teamNotify.rowHeight = 50.f;
  123. teamNotify.type = TeamCardRowItemTypeSwitch;
  124. NIMTeamCardRowItem *itemQuit = [[NIMTeamCardRowItem alloc] init];
  125. itemQuit.title = @"退出讨论组";
  126. itemQuit.action = @selector(quitTeam);
  127. itemQuit.rowHeight = 60.f;
  128. itemQuit.type = TeamCardRowItemTypeRedButton;
  129. return @[@[itemName,teamNotify,],@[itemQuit]];
  130. }
  131. - (void)addHeaderDatas:(NSArray*)members{
  132. NSMutableArray *array = [[NSMutableArray alloc] init];
  133. for (NIMTeamMember *member in members) {
  134. NIMTeamCardMemberItem* item = [[NIMTeamCardMemberItem alloc] initWithMember:member];
  135. [array addObject:item];
  136. }
  137. [self addMembers:array];
  138. }
  139. #pragma mark - UITableViewAction
  140. - (void)updateTeamInfoName{
  141. _updateTeamNameAlertView = [[UIAlertView alloc] initWithTitle:@"" message:@"修改讨论组名称" delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"确认", nil];
  142. _updateTeamNameAlertView.alertViewStyle = UIAlertViewStylePlainTextInput;
  143. [_updateTeamNameAlertView show];
  144. }
  145. - (void)quitTeam{
  146. _quitTeamAlertView = [[UIAlertView alloc] initWithTitle:@"" message:@"确认退出讨论组?" delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"确认", nil];
  147. [_quitTeamAlertView show];
  148. }
  149. #pragma mark - ContactSelectDelegate
  150. - (void)didFinishedSelect:(NSArray *)selectedContacts{
  151. //modify by leo v1.0.7 云信新sdk
  152. /*
  153. if (selectedContacts.count) {
  154. __weak typeof(self) wself = self;
  155. switch (self.currentOpera) {
  156. case CardHeaderOpeatorAdd:{
  157. [NIMKitProgressHUD show];
  158. [[NIMSDK sharedSDK].teamManager addUsers:selectedContacts
  159. toTeam:self.team.teamId
  160. postscript:@"邀请你加入讨论组"
  161. completion:^(NSError *error,NSArray *members) {
  162. [NIMKitProgressHUD dismiss];
  163. if (!error) {
  164. if (self.team.type == NIMTeamTypeNormal) {
  165. [wself addHeaderDatas:members];
  166. }else{
  167. [wself.view makeToast:@"邀请成功,等待验证" duration:2.0 position:CSToastPositionCenter];
  168. }
  169. [wself refreshTableHeader:self.view.nim_width];
  170. }else{
  171. [wself.view makeToast:@"邀请失败"];
  172. }
  173. wself.currentOpera = CardHeaderOpeatorNone;
  174. }];
  175. }
  176. break;
  177. default:
  178. break;
  179. }
  180. }
  181. */
  182. }
  183. - (void)didCancelledSelect{
  184. self.currentOpera = CardHeaderOpeatorNone;
  185. }
  186. #pragma mark - TeamSwitchProtocol
  187. - (void)onStateChanged:(BOOL)on
  188. {
  189. __weak typeof(self) weakSelf = self;
  190. NIMTeamNotifyState state = on? NIMTeamNotifyStateAll : NIMTeamNotifyStateNone;
  191. [[[NIMSDK sharedSDK] teamManager] updateNotifyState:state
  192. inTeam:[self.team teamId]
  193. completion:^(NSError *error) {
  194. [weakSelf refreshTableBody];
  195. }];
  196. }
  197. #pragma mark - NIMTeamManagerDelegate
  198. - (void)onTeamUpdated:(NIMTeam *)team{
  199. if ([team.teamId isEqualToString:self.team.teamId]) {
  200. self.navigationItem.title = [self title];
  201. __weak typeof(self) wself = self;
  202. [self requestData:^(NSError *error, NSArray *data) {
  203. [wself refreshWithMembers:data];
  204. }];
  205. }
  206. }
  207. - (NIMTeamMember*)teamInfo:(NSString*)uid{
  208. for (NIMTeamMember *member in self.teamMembers) {
  209. if ([member.userId isEqualToString:uid]) {
  210. return member;
  211. }
  212. }
  213. return nil;
  214. }
  215. - (void)transferOwner:(NSString *)memberId isLeave:(BOOL)isLeave{
  216. __block typeof(self) wself = self;
  217. NIMTeamMember *memberInfo = [self teamInfo:memberId];
  218. [[NIMSDK sharedSDK].teamManager transferManagerWithTeam:self.team.teamId newOwnerId:memberId isLeave:isLeave completion:^(NSError *error) {
  219. if (!error) {
  220. memberInfo.type = NIMTeamMemberTypeOwner;
  221. [wself.view makeToast:@"修改成功"];
  222. }else{
  223. [wself.view makeToast:@"修改失败"];
  224. }
  225. }];
  226. }
  227. #pragma mark - UITableViewDataSource
  228. - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
  229. return self.bodyData.count;
  230. }
  231. - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
  232. NSArray *sectionData = self.bodyData[section];
  233. return sectionData.count;
  234. }
  235. - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
  236. id<NTESCardBodyData> bodyData = [self bodyDataAtIndexPath:indexPath];
  237. return bodyData.rowHeight;
  238. }
  239. - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{
  240. if (section == 0) {
  241. return 0.0f;
  242. }
  243. return 20.f;
  244. }
  245. - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{
  246. UIView *view = [[UIView alloc] initWithFrame:CGRectZero];
  247. view.backgroundColor = NIMKit_UIColorFromRGB(0xecf1f5);
  248. return view;
  249. }
  250. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
  251. id<NTESCardBodyData> bodyData = [self bodyDataAtIndexPath:indexPath];
  252. UITableViewCell * cell;
  253. NIMKitTeamCardRowItemType type = bodyData.type;
  254. switch (type) {
  255. case TeamCardRowItemTypeCommon:
  256. cell = [self builidCommonCell:bodyData indexPath:indexPath];
  257. break;
  258. case TeamCardRowItemTypeRedButton:
  259. cell = [self builidRedButtonCell:bodyData indexPath:indexPath];
  260. break;
  261. case TeamCardRowItemTypeBlueButton:
  262. cell = [self builidBlueButtonCell:bodyData indexPath:indexPath];
  263. break;
  264. case TeamCardRowItemTypeSwitch:
  265. cell = [self buildTeamSwitchCell:bodyData indexPath:indexPath];
  266. break;
  267. default:
  268. break;
  269. }
  270. return cell;
  271. }
  272. - (UITableViewCell*)builidCommonCell:(id<NTESCardBodyData>) bodyData indexPath:(NSIndexPath *)indexPath{
  273. UITableViewCell * cell = [self.tableView dequeueReusableCellWithIdentifier:TableCellReuseId];
  274. if (!cell) {
  275. cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:TableCellReuseId];
  276. CGFloat left = 15.f;
  277. CGFloat height = 1.f;
  278. UIView *sep = [[UIView alloc] initWithFrame:CGRectMake(left, cell.nim_height - height, cell.nim_width, height)];
  279. sep.backgroundColor = NIMKit_UIColorFromRGB(0xebebeb);
  280. [cell addSubview:sep];
  281. [sep setTag:TableSepTag];
  282. sep.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleTopMargin;
  283. }
  284. UIView *sep = [cell viewWithTag:TableSepTag];
  285. sep.hidden = (indexPath.row + 1 == [self.tableView numberOfRowsInSection:indexPath.section]);
  286. cell.textLabel.text = bodyData.title;
  287. if ([bodyData respondsToSelector:@selector(subTitle)]) {
  288. cell.detailTextLabel.text = bodyData.subTitle;
  289. }
  290. if ([bodyData respondsToSelector:@selector(actionDisabled)] && bodyData.actionDisabled) {
  291. cell.accessoryType = UITableViewCellAccessoryNone;
  292. }else{
  293. cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
  294. }
  295. return cell;
  296. }
  297. - (UITableViewCell*)builidRedButtonCell:(id<NTESCardBodyData>) bodyData indexPath:(NSIndexPath *)indexPath{
  298. NIMKitColorButtonCell * cell = [self.tableView dequeueReusableCellWithIdentifier:TableButtonCellReuseId];
  299. if (!cell) {
  300. cell = [[NIMKitColorButtonCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:TableButtonCellReuseId];
  301. }
  302. cell.button.style = NIMKitColorButtonCellStyleRed;
  303. [cell.button setTitle:bodyData.title forState:UIControlStateNormal];
  304. return cell;
  305. }
  306. - (UITableViewCell*)builidBlueButtonCell:(id<NTESCardBodyData>) bodyData indexPath:(NSIndexPath *)indexPath{
  307. NIMKitColorButtonCell * cell = [self.tableView dequeueReusableCellWithIdentifier:TableButtonCellReuseId];
  308. if (!cell) {
  309. cell = [[NIMKitColorButtonCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:TableButtonCellReuseId];
  310. }
  311. cell.button.style = NIMKitColorButtonCellStyleBlue;
  312. [cell.button setTitle:bodyData.title forState:UIControlStateNormal];
  313. return cell;
  314. }
  315. - (UITableViewCell *)buildTeamSwitchCell:(id<NTESCardBodyData>)bodyData indexPath:(NSIndexPath *)indexPath
  316. {
  317. NIMTeamSwitchTableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:TableSwitchReuseId];
  318. if (!cell) {
  319. cell = [[NIMTeamSwitchTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"NIMTeamSwitchTableViewCell"];
  320. CGFloat left = 15.f;
  321. CGFloat height = 1.f;
  322. UIView *sep = [[UIView alloc] initWithFrame:CGRectMake(left, cell.nim_height - height, cell.nim_width, height)];
  323. sep.backgroundColor = NIMKit_UIColorFromRGB(0xebebeb);
  324. [cell addSubview:sep];
  325. [sep setTag:TableSepTag];
  326. sep.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleTopMargin;
  327. }
  328. UIView *sep = [cell viewWithTag:TableSepTag];
  329. sep.hidden = (indexPath.row + 1 == [self.tableView numberOfRowsInSection:indexPath.section]);
  330. cell.textLabel.text = bodyData.title;
  331. cell.switcher.on = bodyData.switchOn;
  332. cell.switchDelegate = self;
  333. return cell;
  334. }
  335. #pragma mark - UITableViewDelegate
  336. - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
  337. [tableView deselectRowAtIndexPath:indexPath animated:YES];
  338. NSArray *scections = self.bodyData[indexPath.section];
  339. id<NTESCardBodyData> bodyData = scections[indexPath.row];
  340. if ([bodyData respondsToSelector:@selector(actionDisabled)] && bodyData.actionDisabled) {
  341. return;
  342. }
  343. if ([bodyData respondsToSelector:@selector(action)]) {
  344. if (bodyData.action) {
  345. NIMKit_SuppressPerformSelectorLeakWarning([self performSelector:bodyData.action]);
  346. }
  347. }
  348. }
  349. #pragma mark - UIAlertViewDelegate
  350. - (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex{
  351. if (alertView == _updateTeamNameAlertView) {
  352. switch (buttonIndex) {
  353. case 0://取消
  354. break;
  355. case 1:{
  356. NSString *name = [alertView textFieldAtIndex:0].text;
  357. if (name.length) {
  358. [[NIMSDK sharedSDK].teamManager updateTeamName:name teamId:self.team.teamId completion:^(NSError *error) {
  359. if (!error) {
  360. self.team = [[[NIMSDK sharedSDK] teamManager] teamById:self.team.teamId];
  361. [self.view makeToast:@"修改成功"];
  362. [self refreshTableBody];
  363. [self refreshTitle];
  364. }else{
  365. [self.view makeToast:@"修改失败"];
  366. }
  367. }];
  368. }
  369. break;
  370. }
  371. default:
  372. break;
  373. }
  374. }
  375. if (alertView == _quitTeamAlertView) {
  376. switch (buttonIndex) {
  377. case 0://取消
  378. break;
  379. case 1:{
  380. [[NIMSDK sharedSDK].teamManager quitTeam:self.team.teamId completion:^(NSError *error) {
  381. if (!error) {
  382. [self.navigationController popToRootViewControllerAnimated:YES];
  383. }else{
  384. [self.view makeToast:@"退出失败"];
  385. }
  386. }];
  387. break;
  388. }
  389. default:
  390. break;
  391. }
  392. }
  393. }
  394. #pragma mark - NIMMemberGroupViewDelegate
  395. - (void)didSelectRemoveButtonWithMemberId:(NSString *)uid{
  396. __weak typeof(self) wself = self;
  397. [NIMKitProgressHUD show];
  398. [[NIMSDK sharedSDK].teamManager kickUsers:@[uid] fromTeam:self.team.teamId completion:^(NSError *error) {
  399. [NIMKitProgressHUD dismiss];
  400. if (!error) {
  401. [wself removeMembers:@[uid]];
  402. [wself refreshTableHeader:self.view.nim_width];
  403. }else{
  404. [wself.view makeToast:@"移除失败"];
  405. }
  406. }];
  407. }
  408. - (void)didSelectOperator:(NIMKitCardHeaderOpeator)opera{
  409. switch (opera) {
  410. case CardHeaderOpeatorAdd:{
  411. self.currentOpera = CardHeaderOpeatorAdd;
  412. NSMutableArray *users = [[NSMutableArray alloc] init];
  413. NSString *currentUserID = [[[NIMSDK sharedSDK] loginManager] currentAccount];
  414. [users addObject:currentUserID];
  415. [users addObjectsFromArray:self.headerUserIds];
  416. NIMContactFriendSelectConfig *config = [[NIMContactFriendSelectConfig alloc] init];
  417. config.filterIds = users;
  418. config.needMutiSelected = YES;
  419. NIMContactSelectViewController *vc = [[NIMContactSelectViewController alloc] initWithConfig:config];
  420. vc.delegate = self;
  421. [vc show];
  422. break;
  423. }
  424. case CardHeaderOpeatorRemove:{
  425. self.currentOpera = self.currentOpera==CardHeaderOpeatorRemove? CardHeaderOpeatorNone : CardHeaderOpeatorRemove;
  426. [self refreshTableHeader:self.view.nim_width];
  427. break;
  428. }
  429. default:
  430. break;
  431. }
  432. }
  433. #pragma mark - Refresh
  434. - (void)refreshWithMembers:(NSArray*)members{
  435. self.headerData = [members mutableCopy];
  436. [self youpaifsetupTableView];
  437. [self refreshTableBody];
  438. [self refreshTableHeader:self.view.nim_width];
  439. }
  440. - (void)refreshTableHeader:(CGFloat)width{
  441. [self setupTableHeader:width];
  442. }
  443. - (void)refreshTableBody{
  444. self.bodyData = [self buildBodyData];
  445. [self.tableView reloadData];
  446. }
  447. - (void)refreshTitle{
  448. self.navigationItem.title = self.title;
  449. }
  450. - (void)youpaifsetupTableView{
  451. [self setupTableHeader:self.view.nim_width];
  452. self.tableView.tableFooterView = [[UIView alloc] init];
  453. self.tableView.delegate = self;
  454. self.tableView.dataSource = self;
  455. }
  456. - (void)setupTableHeader:(CGFloat)width{
  457. self.headerView = [[NIMMemberGroupView alloc] initWithFrame:CGRectZero];
  458. self.headerView.delegate = self;
  459. NIMKitCardHeaderOpeator opeartor;
  460. if (self.myTeamInfo.type == NIMTeamMemberTypeOwner) {
  461. opeartor = CardHeaderOpeatorAdd | CardHeaderOpeatorRemove;
  462. }else{
  463. opeartor = CardHeaderOpeatorAdd;
  464. }
  465. [self.headerView refreshUids:self.headerUserIds operators:opeartor];
  466. CGSize size = [self.headerView sizeThatFits:CGSizeMake(width, CGFLOAT_MAX)];
  467. self.headerView.nim_size = size;
  468. self.headerView.enableRemove = self.currentOpera == CardHeaderOpeatorRemove;
  469. self.tableView.tableHeaderView = self.headerView;
  470. }
  471. #pragma mark - Private
  472. - (NSArray*)headerUserIds{
  473. NSMutableArray * uids = [[NSMutableArray alloc] init];
  474. for (id<NIMKitCardHeaderData> data in self.headerData) {
  475. if ([data respondsToSelector:@selector(memberId)] && data.memberId.length) {
  476. [uids addObject:data.memberId];
  477. }
  478. }
  479. return uids;
  480. }
  481. - (id<NTESCardBodyData>)bodyDataAtIndexPath:(NSIndexPath*)indexpath{
  482. NSArray *sectionData = self.bodyData[indexpath.section];
  483. return sectionData[indexpath.row];
  484. }
  485. - (void)addMembers:(NSArray*)members{
  486. NSInteger opeatorCount = 0;
  487. for (id<NIMKitCardHeaderData> data in self.headerData.reverseObjectEnumerator.allObjects) {
  488. if ([data respondsToSelector:@selector(opera)]) {
  489. opeatorCount++;
  490. }else{
  491. break;
  492. }
  493. }
  494. NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(self.headerData.count - opeatorCount, members.count)];
  495. [self.headerData insertObjects:members atIndexes:indexSet];
  496. [self refreshWithMembers:self.headerData];
  497. }
  498. - (void)removeMembers:(NSArray*)members{
  499. for (id object in members) {
  500. if ([object isKindOfClass:[NSString class]]) {
  501. for (id<NIMKitCardHeaderData> data in self.headerData) {
  502. if ([data respondsToSelector:@selector(memberId)] && [data.memberId isEqualToString:object]) {
  503. [self.headerData removeObject:data];
  504. break;
  505. }
  506. }
  507. }else{
  508. [self.headerData removeObject:object];
  509. }
  510. }
  511. [self refreshWithMembers:self.headerData];
  512. }
  513. @end