BogoSearchSubViewController.m 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545
  1. //
  2. // BogoSearchSubViewController.m
  3. // BuguLive
  4. //
  5. // Created by Mac on 2021/9/27.
  6. // Copyright © 2021 xfg. All rights reserved.
  7. //
  8. #import "BogoSearchSubViewController.h"
  9. #import "BogoSearchHeaderView.h"
  10. #import "FollowerTableViewCell.h"
  11. #import "WBStatusCell.h"
  12. #import "BogoSearchVideoListCell.h"
  13. #import "BogoSearchResultModel.h"
  14. #import "SHomePageVC.h"
  15. #import "DetailsLineViewController.h"
  16. #import "MGGroupUserInfo.h"
  17. #import "HMVideoPlayerViewController.h"
  18. #import "YHPlayerViewController.h"
  19. #import "YYPhotoGroupView.h"
  20. @interface BogoSearchSubViewController ()<UITableViewDelegate,UITableViewDataSource,BogoSearchHeaderViewDelegate,BogoSearchVideoListCellDelegate,WBStatusCellDelegate>
  21. @property(nonatomic, strong) UITableView *tableView;
  22. @property(nonatomic, strong) NSMutableArray <SenderModel *>*userDataArray;
  23. @property(nonatomic, strong) NSMutableArray *videoDataArray;
  24. @property(nonatomic, strong) NSMutableArray <WBStatusLayout *>*dynamicDataArray;
  25. @property(nonatomic, assign) NSInteger page;
  26. @end
  27. @implementation BogoSearchSubViewController
  28. - (void)viewDidLoad{
  29. [super viewDidLoad];
  30. [self.view addSubview:self.tableView];
  31. }
  32. - (void)setKeyword:(NSString *)keyword{
  33. _keyword = keyword;
  34. [self headerRefresh];
  35. }
  36. - (void)headerRefresh{
  37. self.page = 1;
  38. [self requestData];
  39. }
  40. - (void)footerRefresh{
  41. self.page = self.page + 1;
  42. [self requestData];
  43. }
  44. - (void)requestData{
  45. // /mapi/index.php?ctl=index&act=search_all&keyword=夏&type=0
  46. [self.httpsManager POSTWithParameters:[NSMutableDictionary dictionaryWithDictionary:@{@"ctl":@"index",@"act":@"search_all",@"keyword":self.keyword,@"type":@(self.type),@"page":@(self.page)}] SuccessBlock:^(NSDictionary *responseJson) {
  47. if (self.page == 1) {
  48. [self.userDataArray removeAllObjects];
  49. [self.videoDataArray removeAllObjects];
  50. [self.dynamicDataArray removeAllObjects];
  51. }
  52. if ([responseJson toInt:@"status"] == 1) {
  53. BogoSearchResultModel *model = [BogoSearchResultModel mj_objectWithKeyValues:responseJson];
  54. if (self.type == BogoSearchSubViewControllerTypeAll) {
  55. [self.userDataArray addObjectsFromArray:model.user];
  56. [self.videoDataArray addObjectsFromArray:model.weibo];
  57. for (WBModel *status in model.dynamic) {
  58. WBStatusLayout *layout = [[WBStatusLayout alloc]initWithStatus:status style:WBLayoutStyleTimeline];
  59. [self.dynamicDataArray addObject:layout];
  60. }
  61. }else if (self.type == BogoSearchSubViewControllerTypeUser){
  62. [self.userDataArray addObjectsFromArray:model.user];
  63. }else if (self.type == BogoSearchSubViewControllerTypeVideo){
  64. [self.videoDataArray addObjectsFromArray:model.weibo];
  65. }else if (self.type == BogoSearchSubViewControllerTypeDynamic){
  66. for (WBModel *status in model.dynamic) {
  67. WBStatusLayout *layout = [[WBStatusLayout alloc]initWithStatus:status style:WBLayoutStyleTimeline];
  68. [self.dynamicDataArray addObject:layout];
  69. }
  70. }
  71. [self.tableView reloadData];
  72. }
  73. [self.tableView.mj_header endRefreshing];
  74. int has_next = [responseJson toInt:@"has_next"];
  75. if (has_next) {
  76. [self.tableView.mj_footer endRefreshing];
  77. }else{
  78. [self.tableView.mj_footer endRefreshingWithNoMoreData];
  79. }
  80. } FailureBlock:^(NSError *error) {
  81. [[BGHUDHelper sharedInstance]tipMessage:error.localizedDescription];
  82. [self.tableView.mj_header endRefreshing];
  83. [self.tableView.mj_footer endRefreshing];
  84. }];
  85. }
  86. - (UITableView *)tableView{
  87. if (!_tableView) {
  88. _tableView = [[UITableView alloc]initWithFrame:CGRectMake(0, 0, kScreenW, kScreenH - FD_Top_Height - 40) style:UITableViewStyleGrouped];
  89. _tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
  90. _tableView.delegate = self;
  91. _tableView.dataSource = self;
  92. if (@available(iOS 11.0, *)) {
  93. _tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
  94. } else {
  95. // Fallback on earlier versions
  96. self.automaticallyAdjustsScrollViewInsets = NO;
  97. }
  98. self.tableView.contentInset = UIEdgeInsetsMake(0, 0, FD_Bottom_SafeArea_Height, 0);
  99. [_tableView registerClass:[WBStatusCell class] forCellReuseIdentifier:@"WBStatusCell"];
  100. [_tableView registerNib:[UINib nibWithNibName:@"FollowerTableViewCell" bundle:[NSBundle mainBundle]] forCellReuseIdentifier:@"FollowerTableViewCell"];
  101. [_tableView registerNib:[UINib nibWithNibName:@"BogoSearchVideoListCell" bundle:[NSBundle mainBundle]] forCellReuseIdentifier:@"BogoSearchVideoListCell"];
  102. _tableView.mj_header = [MJRefreshHeader headerWithRefreshingTarget:self refreshingAction:@selector(requestData)];
  103. }
  104. return _tableView;
  105. }
  106. #pragma mark - BogoSearchVideoListCellDelegate
  107. - (void)videoListCell:(BogoSearchVideoListCell *)videoListCell didClickVideo:(SmallVideoListModel *)model{
  108. HMVideoPlayerViewController *vc = [[HMVideoPlayerViewController alloc]initWithVideos:self.videoDataArray index:[self.videoDataArray indexOfObject:model] IsPushed:YES requestDict:nil];
  109. vc.isRefreshVideoBlock = ^(BOOL isRefresh) {
  110. [self headerRefresh];
  111. };
  112. [[AppDelegate sharedAppDelegate] pushViewController:vc animated:YES];
  113. }
  114. #pragma mark - BogoSearchHeaderViewDelegate
  115. - (void)headerView:(BogoSearchHeaderView *)headerView didClickAllBtn:(UIButton *)sender{
  116. if (self.delegate && [self.delegate respondsToSelector:@selector(subVC:headerView:didClickAllBtn:)]) {
  117. [self.delegate subVC:self headerView:headerView didClickAllBtn:sender];
  118. }
  119. }
  120. #pragma mark - WBStatusCellDelegate
  121. /// 点击了 Cell
  122. - (void)cellDidClick:(WBStatusCell *)cell {
  123. if (self.dynamicDataArray.count > 0) {
  124. MGGroupUserInfo *model = (MGGroupUserInfo *)cell.layout.status;
  125. DetailsLineViewController *datails = [DetailsLineViewController new];
  126. datails.title = ASLocalizedString(@"动态详情");
  127. datails.model = model;
  128. datails.refreshData = ^{
  129. [self headerRefresh];
  130. // self.logic.page = _currentRequestPage;
  131. // [self.logic loadListDataWithAct:self.homeType];
  132. };
  133. [[AppDelegate sharedAppDelegate] pushViewController:datails animated:YES];
  134. // [self.tableView deselectRowAtIndexPath:indexPath animated:YES];
  135. [AppDelegate sharedAppDelegate].topViewController.hidesBottomBarWhenPushed = YES;
  136. }
  137. }
  138. /// 点击了用户
  139. - (void)cell:(WBStatusCell *)cell didClickUser:(WBUserInfoModel *)user {
  140. SHomePageVC *tmpController= [[SHomePageVC alloc]init];
  141. tmpController.user_id = cell.statusView.layout.status.uid;
  142. tmpController.type = 0;
  143. [[AppDelegate sharedAppDelegate]pushViewController:tmpController animated:YES];
  144. }
  145. //点击了关注
  146. - (void)cell:(WBStatusCell *)cell didClickMore:(UIButton *)sender{
  147. WBModel *model = cell.layout.status;
  148. NSMutableDictionary *parmDict = [[NSMutableDictionary alloc]init];
  149. [parmDict setObject:@"user" forKey:@"ctl"];
  150. [parmDict setObject:@"follow" forKey:@"act"];
  151. [parmDict setObject:SafeStr(model.uid) forKey:@"to_user_id"];
  152. FWWeakify(self)
  153. [[NetHttpsManager manager] POSTWithParameters:parmDict SuccessBlock:^(NSDictionary *responseJson) {
  154. if ([[responseJson valueForKey:@"status"] integerValue] == 1) {
  155. model.is_focus = @"1";
  156. cell.statusView.layout.status = model;
  157. [self.dynamicDataArray replaceObjectAtIndex:cell.indexRows withObject:cell.statusView.layout];
  158. sender.hidden = YES;
  159. }else{
  160. [BGHUDHelper alert:[responseJson valueForKey:@"error"]];
  161. }
  162. } FailureBlock:^(NSError *error) {
  163. }];
  164. }
  165. /// 点击了评论
  166. - (void)cellDidClickComment:(WBStatusCell *)cell {
  167. WBModel *model = cell.statusView.layout.status;
  168. DetailsLineViewController *datails = [DetailsLineViewController new];
  169. datails.hidesBottomBarWhenPushed = YES;
  170. datails.title = ASLocalizedString(@"评论");
  171. datails.model = (MGGroupUserInfo *)model;
  172. datails.refreshData = ^{
  173. [self headerRefresh];
  174. };
  175. [self.navigationController pushViewController:datails animated:YES];
  176. }
  177. -(void)cell:(WBStatusCell *)cell didClickDeleteBtn:(UIButton *)sender{
  178. __weak __typeof(self)weakSelf = self;
  179. [FanweMessage alert:ASLocalizedString(@"提示")message:ASLocalizedString(@"确定删除该动态?")destructiveAction:^{
  180. NSMutableDictionary *parmDict = [NSMutableDictionary dictionary];
  181. [parmDict setObject:@"dynamic" forKey:@"ctl"];
  182. [parmDict setObject:@"del_dynamic" forKey:@"act"];
  183. [parmDict setObject:cell.layout.status.id forKey:@"dynamic_id"];
  184. FWWeakify(self)
  185. [[NetHttpsManager manager] POSTWithParameters:parmDict SuccessBlock:^(NSDictionary *responseJson) {
  186. if ([[responseJson valueForKey:@"status"] integerValue] == 1) {
  187. [FanweMessage alertHUD:ASLocalizedString(@"删除动态成功")];
  188. }else{
  189. [FanweMessage alertHUD:[responseJson valueForKey:@"error"]];
  190. }
  191. [self headerRefresh];
  192. } FailureBlock:^(NSError *error) {
  193. }];
  194. } cancelAction:^{
  195. }];
  196. }
  197. /// 点击了赞
  198. - (void)cellDidClickLike:(WBStatusCell *)cell {
  199. __weak __typeof(self)weakSelf = self;
  200. WBModel *status = cell.statusView.layout.status;
  201. NSMutableDictionary *parmDict = [NSMutableDictionary dictionary];
  202. [parmDict setObject:@"dynamic" forKey:@"ctl"];
  203. [parmDict setObject:@"praise" forKey:@"act"];
  204. [parmDict setObject:SafeStr(status.id) forKey:@"dynamic_id"];
  205. NSString *like = !status.is_like.integerValue ? @"1" : @"2";
  206. [parmDict setObject:like forKey:@"is_praise"];
  207. FWWeakify(self)
  208. [[NetHttpsManager manager] POSTWithParameters:parmDict SuccessBlock:^(NSDictionary *responseJson) {
  209. NSInteger praise = [status.praise integerValue];
  210. if ([[responseJson valueForKey:@"status"]integerValue] == 1) {
  211. [cell.statusView.toolbarView setLiked:[[responseJson valueForKey:@"is_like"]intValue] withAnimation:YES];
  212. }
  213. } FailureBlock:^(NSError *error) {
  214. }];
  215. }
  216. #pragma 视频相关
  217. - (void)cell:(WBStatusCell *)cell didClickVideo:(NSString *)url{
  218. YHPlayerViewController *vc = [[YHPlayerViewController alloc]initWithPlayerURL:cell.layout.status.video];
  219. [[AppDelegate sharedAppDelegate] pushViewController:vc animated:YES];
  220. }
  221. /// 点击了图片
  222. - (void)cell:(WBStatusCell *)cell didClickImageAtIndex:(NSUInteger)index {
  223. UIView *fromView = nil;
  224. NSMutableArray *items = [NSMutableArray new];
  225. WBModel *status = cell.statusView.layout.status;
  226. NSArray<NSString *> *pics = status.picUrls;
  227. NSArray<NSString *> *originPics = status.picUrls;
  228. for (NSUInteger i = 0, max = pics.count; i < max; i++) {
  229. UIView *imgView = cell.statusView.picViews[i];
  230. YYPhotoGroupItem *item = [YYPhotoGroupItem new];
  231. item.thumbView = imgView;
  232. item.largeImageURL = [NSURL URLWithString:originPics[i]];
  233. item.largeImageSize = CGSizeMake(kScreenW, kScreenH);
  234. [items addObject:item];
  235. if (i == index) {
  236. fromView = imgView;
  237. }
  238. }
  239. YYPhotoGroupView *v = [[YYPhotoGroupView alloc] initWithGroupItems:items];
  240. [v presentFromImageView:fromView toContainer:[UIApplication sharedApplication].keyWindow animated:YES completion:nil];
  241. }
  242. #pragma mark - UITableViewDelegate,UITableViewDataSource
  243. - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
  244. if (self.type == BogoSearchSubViewControllerTypeAll) {
  245. return 3;
  246. }
  247. return 1;
  248. }
  249. - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
  250. if (self.type == BogoSearchSubViewControllerTypeAll) {
  251. if (section == 0) {
  252. return self.userDataArray.count;
  253. }else if (section == 1){
  254. return self.videoDataArray.count ? 1 : 0;
  255. }else if (section == 2){
  256. return self.dynamicDataArray.count ? 2 : 0;
  257. }else{
  258. return 0;
  259. }
  260. }else if (self.type == BogoSearchSubViewControllerTypeUser){
  261. return self.userDataArray.count;
  262. }else if (self.type == BogoSearchSubViewControllerTypeDynamic){
  263. return self.dynamicDataArray.count;
  264. }else{
  265. return 0;
  266. }
  267. }
  268. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
  269. if (self.type == BogoSearchSubViewControllerTypeAll) {
  270. if (indexPath.section == 0) {
  271. FollowerTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"FollowerTableViewCell" forIndexPath:indexPath];
  272. if (indexPath.row < self.userDataArray.count) {
  273. [cell creatCellWithModel:self.userDataArray[indexPath.row] WithRow:indexPath.row];
  274. }
  275. cell.selectionStyle = UITableViewCellSelectionStyleNone;
  276. return cell;
  277. }else if (indexPath.section == 1){
  278. BogoSearchVideoListCell *cell = [tableView dequeueReusableCellWithIdentifier:@"BogoSearchVideoListCell" forIndexPath:indexPath];
  279. if (self.videoDataArray.count) {
  280. if (self.videoDataArray.count > 2) {
  281. NSMutableArray *dataArr = [NSMutableArray array];
  282. [dataArr addObject:self.videoDataArray[0]];
  283. [dataArr addObject:self.videoDataArray[1]];
  284. cell.dataArray = dataArr;
  285. }else{
  286. cell.dataArray = self.videoDataArray;
  287. }
  288. }
  289. cell.delegate = self;
  290. return cell;
  291. }else if (indexPath.section == 2){
  292. WBStatusCell *cell = [tableView dequeueReusableCellWithIdentifier:@"WBStatusCell" forIndexPath:indexPath];
  293. if (indexPath.row < self.dynamicDataArray.count) {
  294. // if (self.dynamicDataArray.count > 2) {
  295. // NSMutableArray *dataArr = [NSMutableArray array];
  296. // [dataArr addObject:self.dynamicDataArray[0]];
  297. // [dataArr addObject:self.dynamicDataArray[1]];
  298. // cell.layout = dataArr[indexPath.row];
  299. // }else{
  300. cell.layout = self.dynamicDataArray[indexPath.row];
  301. // }
  302. }
  303. cell.delegate = self;
  304. return cell;
  305. }else{
  306. return nil;
  307. }
  308. }else if (self.type == BogoSearchSubViewControllerTypeUser){
  309. FollowerTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"FollowerTableViewCell" forIndexPath:indexPath];
  310. if (indexPath.row < self.userDataArray.count) {
  311. [cell creatCellWithModel:self.userDataArray[indexPath.row] WithRow:indexPath.row];
  312. }
  313. cell.selectionStyle = UITableViewCellSelectionStyleNone;
  314. return cell;
  315. }else if (self.type == BogoSearchSubViewControllerTypeDynamic){
  316. WBStatusCell *cell = [tableView dequeueReusableCellWithIdentifier:@"WBStatusCell" forIndexPath:indexPath];
  317. if (indexPath.row < self.dynamicDataArray.count) {
  318. cell.layout = self.dynamicDataArray[indexPath.row];
  319. }
  320. cell.delegate = self;
  321. return cell;
  322. }else{
  323. return nil;
  324. }
  325. }
  326. - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
  327. if (self.type == BogoSearchSubViewControllerTypeAll) {
  328. if (indexPath.section == 0) {
  329. return 71;
  330. }else if (indexPath.section == 1){
  331. return 291;
  332. }else if (indexPath.section == 2){
  333. return self.dynamicDataArray[indexPath.row].height;
  334. }else{
  335. return 0;
  336. }
  337. }else if (self.type == BogoSearchSubViewControllerTypeUser){
  338. return 71;
  339. }else if (self.type == BogoSearchSubViewControllerTypeDynamic){
  340. return self.dynamicDataArray[indexPath.row].height;
  341. }else{
  342. return 0;
  343. }
  344. }
  345. - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
  346. if (self.type == BogoSearchSubViewControllerTypeAll) {
  347. if (indexPath.section == 0) {
  348. SenderModel *sModel = self.userDataArray[indexPath.row];
  349. SHomePageVC *homeVC = [[SHomePageVC alloc]init];
  350. homeVC.user_id = sModel.user_id;
  351. homeVC.type = 0;
  352. // homeVC.user_nickname = sModel.nick_name;
  353. // homeVC.user_headimg = sModel.head_image;
  354. [self.navigationController pushViewController:homeVC animated:YES];
  355. }else if (indexPath.section == 2){
  356. MGGroupUserInfo *model = self.dynamicDataArray[indexPath.row];
  357. DetailsLineViewController *datails = [DetailsLineViewController new];
  358. datails.title = ASLocalizedString(@"动态详情");
  359. datails.model = model;
  360. datails.refreshData = ^{
  361. // self.logic.page = _currentRequestPage;
  362. // [self.logic loadListDataWithAct:self.homeType];
  363. [self headerRefresh];
  364. };
  365. [[AppDelegate sharedAppDelegate] pushViewController:datails animated:YES];
  366. [tableView deselectRowAtIndexPath:indexPath animated:YES];
  367. [AppDelegate sharedAppDelegate].topViewController.hidesBottomBarWhenPushed = YES;
  368. }
  369. }else if (self.type == BogoSearchSubViewControllerTypeUser){
  370. SenderModel *sModel = self.userDataArray[indexPath.row];
  371. SHomePageVC *homeVC = [[SHomePageVC alloc]init];
  372. homeVC.user_id = sModel.user_id;
  373. homeVC.type = 0;
  374. // homeVC.user_nickname = sModel.nick_name;
  375. // homeVC.user_headimg = sModel.head_image;
  376. [self.navigationController pushViewController:homeVC animated:YES];
  377. }else if (self.type == BogoSearchSubViewControllerTypeDynamic){
  378. MGGroupUserInfo *model = self.dynamicDataArray[indexPath.row];
  379. DetailsLineViewController *datails = [DetailsLineViewController new];
  380. datails.title = ASLocalizedString(@"动态详情");
  381. datails.model = model;
  382. datails.refreshData = ^{
  383. // self.logic.page = _currentRequestPage;
  384. // [self.logic loadListDataWithAct:self.homeType];
  385. [self headerRefresh];
  386. };
  387. [[AppDelegate sharedAppDelegate] pushViewController:datails animated:YES];
  388. [tableView deselectRowAtIndexPath:indexPath animated:YES];
  389. [AppDelegate sharedAppDelegate].topViewController.hidesBottomBarWhenPushed = YES;
  390. }
  391. }
  392. - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{
  393. if (self.type == BogoSearchSubViewControllerTypeAll) {
  394. BogoSearchHeaderView *headerView = [[NSBundle mainBundle] loadNibNamed:@"BogoSearchHeaderView" owner:nil options:nil].lastObject;
  395. headerView.type = section;
  396. headerView.delegate = self;
  397. if (self.type == BogoSearchSubViewControllerTypeAll) {
  398. if (section == 0) {
  399. headerView.allBtn.hidden = self.userDataArray.count > 2 ? NO : YES;
  400. }else if (section == 1){
  401. headerView.allBtn.hidden = self.videoDataArray.count > 2 ? NO : YES;
  402. }else if (section == 2){
  403. headerView.allBtn.hidden = self.dynamicDataArray.count > 2 ? NO : YES;
  404. }
  405. }
  406. return headerView;
  407. }
  408. return nil;
  409. }
  410. - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{
  411. if (self.type == BogoSearchSubViewControllerTypeAll) {
  412. return 44;
  413. }
  414. return 0.01;
  415. }
  416. - (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section{
  417. return 0.01;
  418. }
  419. - (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section{
  420. return nil;
  421. }
  422. - (NSMutableArray<SenderModel *> *)userDataArray{
  423. if (!_userDataArray) {
  424. _userDataArray = [NSMutableArray array];
  425. }
  426. return _userDataArray;
  427. }
  428. - (NSMutableArray *)videoDataArray{
  429. if (!_videoDataArray) {
  430. _videoDataArray = [NSMutableArray array];
  431. }
  432. return _videoDataArray;
  433. }
  434. - (NSMutableArray<WBStatusLayout *> *)dynamicDataArray{
  435. if (!_dynamicDataArray) {
  436. _dynamicDataArray = [NSMutableArray array];
  437. }
  438. return _dynamicDataArray;
  439. }
  440. @end