recordViewController.m 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770
  1. //
  2. // recordViewController.m
  3. // 双子星云手机
  4. //
  5. // Created by xd h on 2025/3/28.
  6. //
  7. #import "recordViewController.h"
  8. #import "recordBottomView.h"
  9. #import "recordingView.h"
  10. #import <AVFoundation/AVFoundation.h>
  11. #import "recordFileModel.h"
  12. #import "recordFileCell.h"
  13. #import "reNameRecordFileView.h"
  14. #import "ComontAlretViewController.h"
  15. #import "editTypeHeadView.h"
  16. #import "recordEditBottomView.h"
  17. @interface recordViewController ()<UITableViewDelegate,UITableViewDataSource,DZNEmptyDataSetSource, DZNEmptyDataSetDelegate>
  18. @property (nonatomic, strong) UIButton *rightButton;//编辑
  19. @property(nonatomic,strong) editTypeHeadView*curEditTypeHeadView;
  20. @property(nonatomic,strong) recordEditBottomView*curEditTypeBottomView;
  21. @property(nonatomic,strong) NSMutableArray* didSelectListArr;
  22. @property(nonatomic,assign) BOOL isEditType;
  23. @property (nonatomic, strong) UITableView *tableView;
  24. @property(nonatomic,strong)NSMutableArray *audioArr;//音频数据
  25. @property(nonatomic,strong)recordBottomView *recordBottomV;//底部视图
  26. @property(nonatomic,strong)recordingView *recordingV;//录音中
  27. @property(nonatomic,strong)reNameRecordFileView * reNameRecordFileV;
  28. @end
  29. @implementation recordViewController
  30. - (void)viewDidLoad {
  31. [super viewDidLoad];
  32. // Do any additional setup after loading the view.
  33. _audioArr = [NSMutableArray new];
  34. _didSelectListArr = [NSMutableArray new];
  35. [self drawAnyView];
  36. [self getRecordDataFun];
  37. }
  38. - (void)drawAnyView
  39. {
  40. [self.view setBackgroundColor:HWF5F7FAColor];
  41. self.navBarBGView.hidden = NO;
  42. [self.navigationBar setHidden:YES];
  43. [self.toolBar setHidden:YES];
  44. [self.titleLabel setText:NSLocalizedString(@"mine_record_title",nil)];
  45. self.navBarBGView.backgroundColor = [UIColor whiteColor];
  46. //编辑
  47. _rightButton = [[UIButton alloc] init];
  48. [_rightButton setTitle:NSLocalizedString(@"edit_common",nil) forState:UIControlStateNormal];
  49. [_rightButton setTitleColor:[UIColor hwColor:@"#01B7EA"] forState:UIControlStateNormal];
  50. _rightButton.titleLabel.font = [UIFont systemFontOfSize:14.0];
  51. _rightButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentRight;
  52. [_rightButton addTarget:self action:@selector(didClickEditFun) forControlEvents:UIControlEventTouchUpInside];
  53. [self.navBarBGView addSubview:_rightButton];
  54. [_rightButton mas_makeConstraints:^(MASConstraintMaker *make) {
  55. make.right.mas_equalTo(-15.f);
  56. make.width.mas_equalTo(40.f);
  57. make.centerY.equalTo(self.titleLabel.mas_centerY).offset(0.0);
  58. make.height.mas_equalTo(30);
  59. }];
  60. _curEditTypeHeadView = [[editTypeHeadView alloc] init];
  61. _curEditTypeHeadView.hidden = YES;
  62. [self.navBarBGView addSubview:_curEditTypeHeadView];
  63. [_curEditTypeHeadView mas_makeConstraints:^(MASConstraintMaker *make) {
  64. make.left.mas_equalTo(0);
  65. make.right.mas_equalTo(0);
  66. make.bottom.mas_equalTo(0);
  67. make.height.mas_equalTo(NAVIHEIGHT - AdaptNaviHeight);
  68. }];
  69. #pragma mark 编辑状态的 取消 和全选按钮 响应事件
  70. KWeakSelf
  71. _curEditTypeHeadView.didClickButtonFun = ^(NSInteger tag) {
  72. if(tag==1){
  73. [weakSelf userCancelEditTypeFun];
  74. }
  75. };
  76. _curEditTypeHeadView.didClickSelectAllFun = ^(UIButton * _Nonnull but) {
  77. [weakSelf didClickSelectAllButton:but];
  78. };
  79. _curEditTypeBottomView = [[recordEditBottomView alloc] init];
  80. _curEditTypeBottomView.hidden = YES;
  81. [self.view addSubview:_curEditTypeBottomView];
  82. [_curEditTypeBottomView mas_makeConstraints:^(MASConstraintMaker *make) {
  83. make.left.mas_equalTo(0);
  84. make.right.mas_equalTo(0);
  85. make.bottom.mas_equalTo(0);
  86. make.height.mas_equalTo(60 + AdaptTabHeight);
  87. }];
  88. #pragma mark 编辑状态的 下载 删除 响应事件
  89. _curEditTypeBottomView.didClickButtonFun = ^(NSInteger tag) {
  90. if(tag==1){
  91. //[weakSelf gotoDownLoadFileFun];
  92. }
  93. else if(tag==3){
  94. [weakSelf showDeleteAlearViewFun];
  95. }
  96. };
  97. //底部视图
  98. _recordBottomV = [[recordBottomView alloc] init];
  99. [self.view addSubview:_recordBottomV];
  100. [_recordBottomV mas_makeConstraints:^(MASConstraintMaker *make) {
  101. make.left.mas_equalTo(0.f);
  102. make.right.mas_equalTo(0.f);
  103. make.bottom.mas_equalTo(0.f);
  104. make.height.mas_equalTo(100.f + AdaptTabHeight);
  105. }];
  106. //KWeakSelf
  107. _recordBottomV.didClickRecordFun = ^{
  108. [weakSelf didClickRecordFun];
  109. };
  110. [self.view addSubview:self.tableView];
  111. [self.tableView mas_makeConstraints:^(MASConstraintMaker *make) {
  112. make.left.mas_equalTo(0);
  113. make.right.mas_equalTo(0);
  114. make.bottom.equalTo(self.recordBottomV.mas_top).offset(0.f);
  115. //make.bottom.mas_equalTo(0);
  116. make.top.equalTo(self.navBarBGView.mas_bottom).offset(10.f);
  117. }];
  118. }
  119. #pragma mark - 懒加载
  120. - (UITableView *)tableView{
  121. if (!_tableView) {
  122. _tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_W, SCREEN_H - TABBARHEIGHT) style:UITableViewStylePlain];
  123. _tableView.delegate = self;
  124. _tableView.dataSource = self;
  125. _tableView.showsVerticalScrollIndicator = NO;
  126. _tableView.showsHorizontalScrollIndicator = NO;
  127. // _tableView.contentInset = UIEdgeInsetsMake(-H_STATE_BAR, 0, 0, 0);
  128. [_tableView setSeparatorStyle:(UITableViewCellSeparatorStyleNone)];
  129. [_tableView setSeparatorColor:[UIColor clearColor]];
  130. [_tableView setBackgroundColor:[UIColor clearColor]];
  131. [_tableView setTableFooterView:[UIView new]];
  132. [_tableView setBounces:YES];
  133. if (@available(iOS 15.0, *)) {
  134. _tableView.sectionHeaderTopPadding = 0;
  135. }
  136. //空数据引入第三方开源处理
  137. _tableView.emptyDataSetSource = self;
  138. _tableView.emptyDataSetDelegate = self;
  139. // 下拉追加
  140. // MJRefreshAutoNormalFooter *footer = [MJRefreshAutoNormalFooter footerWithRefreshingBlock:^{
  141. // [self getMoreNetWorkData];
  142. // }];
  143. //
  144. // NSString *text = NSLocalizedString(@"NAS_bottom_tip",nil);
  145. // [footer setTitle:text forState:MJRefreshStateNoMoreData];
  146. // _tableView.mj_footer = footer;
  147. }
  148. return _tableView;
  149. }
  150. #pragma mark - 列表委托
  151. - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
  152. if(!_audioArr){
  153. return 0;
  154. }
  155. return _audioArr.count;
  156. }
  157. - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
  158. return 1;
  159. }
  160. - (recordFileCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
  161. __block NSInteger row = indexPath.section;
  162. static NSString *identifier = @"recordFileCell";
  163. recordFileCell * cell = [tableView dequeueReusableCellWithIdentifier:identifier];
  164. cell.selectionStyle = UITableViewCellSelectionStyleNone;
  165. if (!cell){
  166. cell = [[recordFileCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:identifier];
  167. [cell setSelectionStyle:UITableViewCellSelectionStyleNone];
  168. [cell setBackgroundColor:[UIColor clearColor]];
  169. [cell setAccessoryType:(UITableViewCellAccessoryNone)];
  170. }
  171. if(row < _audioArr.count){
  172. recordFileModel* dataModel = _audioArr[row];
  173. cell.curRecordFileModel = dataModel;
  174. KWeakSelf
  175. cell.didClickRecordButFun = ^(NSInteger index) {
  176. [weakSelf didClickCellFunBy:index withRow:row];
  177. };
  178. cell.didClickSwitch = ^(BOOL SwitchOn) {
  179. [weakSelf userCheckFilePreviewByRow:row];
  180. };
  181. }
  182. return cell;
  183. }
  184. - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
  185. NSInteger row = indexPath.section;
  186. if(row >=_audioArr.count){
  187. return 0.0;
  188. }
  189. recordFileModel *model = _audioArr[row];
  190. if (model.showAllType) {
  191. return 150;
  192. }
  193. return 65;
  194. }
  195. - (UIView*)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
  196. {
  197. return [UIView new];
  198. }
  199. - (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section{
  200. return 12.0;
  201. }
  202. - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
  203. {
  204. if (_isEditType) {
  205. return;
  206. }
  207. NSInteger row = indexPath.section;
  208. if(row < _audioArr.count){
  209. recordFileModel *model = _audioArr[row];
  210. if(!model.showAllType){
  211. model.showAllType = YES;
  212. [tableView reloadData];
  213. }
  214. }
  215. }
  216. #pragma mark 空数据
  217. - (UIImage *)imageForEmptyDataSet:(UIScrollView *)scrollView {
  218. NSString *imageName = @"common_no_data_pic";
  219. return [UIImage imageNamed:imageName];
  220. }
  221. - (NSAttributedString *)titleForEmptyDataSet:(UIScrollView *)scrollView {
  222. NSString *text = NSLocalizedString(@"record_no_data_tip",nil);
  223. NSDictionary *attributes = @{NSFontAttributeName: [UIFont systemFontOfSize:16.0f],
  224. NSForegroundColorAttributeName: HW999999Color};
  225. return [[NSAttributedString alloc] initWithString:text attributes:attributes];
  226. }
  227. //调整图片位置
  228. - (CGFloat)verticalOffsetForEmptyDataSet:(UIScrollView *)scrollView {
  229. return -150;
  230. }
  231. #pragma mark 读取本地数据
  232. - (void)getRecordDataFun
  233. {
  234. NSString *documentsDirectory = kSHPath_Record;
  235. NSFileManager *fileManager = [NSFileManager defaultManager];
  236. NSError *error = nil;
  237. NSArray *fileList = [fileManager contentsOfDirectoryAtPath:documentsDirectory error:&error];
  238. if (error) {
  239. HLog(@"Error reading contents of directory: %@", error.localizedDescription);
  240. }
  241. NSMutableArray *dataArr = [NSMutableArray new];
  242. //BOOL isFirstType = YES;
  243. for (NSString *fileName in fileList) {
  244. NSString *filePath = [documentsDirectory stringByAppendingPathComponent:fileName];
  245. // 获取文件属性
  246. NSDictionary *fileAttributes = [fileManager attributesOfItemAtPath:filePath error:&error];
  247. if (error) {
  248. NSLog(@"获取文件属性出错: %@ - %@", fileName, error.localizedDescription);
  249. error = nil;
  250. continue;
  251. }
  252. // 判断是否是目录
  253. BOOL isDirectory = [fileAttributes[NSFileType] isEqualToString:NSFileTypeDirectory];
  254. // 获取文件大小
  255. unsigned long long fileSize = [fileAttributes[NSFileSize] unsignedLongLongValue];
  256. recordFileModel *model = [recordFileModel new];
  257. model.fileName = fileName;
  258. model.filePath = filePath;
  259. model.fileSize = fileSize;
  260. model.isDirectory = isDirectory;
  261. model.modificationDate = fileAttributes[NSFileModificationDate] ?: [NSDate date];
  262. NSURL *fileUrl = [NSURL URLWithString:model.filePath];
  263. NSTimeInterval time = [self getDurationOfAudioFile:fileUrl];
  264. model.totalTime = (NSInteger)ceil(time); // 结果为 5;
  265. model.showAllType = NO;
  266. // if (isFirstType) {
  267. // model.showAllType = YES;
  268. // isFirstType = NO;
  269. // }
  270. // else{
  271. // model.showAllType = NO;
  272. // }
  273. // 创建文件信息字典
  274. // NSDictionary *fileInfo = @{
  275. // @"name": fileName,
  276. // @"path": filePath,
  277. // @"size": @(fileSize),
  278. // @"isDirectory": @(isDirectory),
  279. // @"modificationDate": fileAttributes[NSFileModificationDate] ?: [NSDate date]
  280. // };
  281. [dataArr addObject:model];
  282. }
  283. // 假设你的对象有一个名为 dateProperty 的 NSDate 属性
  284. NSArray *sortedArray = [dataArr sortedArrayUsingComparator:^NSComparisonResult(recordFileModel* obj1, recordFileModel* obj2) {
  285. return [obj2.modificationDate compare:obj1.modificationDate];
  286. }];
  287. [_audioArr removeAllObjects];
  288. [_audioArr addObjectsFromArray:sortedArray];
  289. recordFileModel *firstModel = _audioArr.firstObject;
  290. firstModel.showAllType = YES;
  291. }
  292. #pragma mark 获取录音文件的时长
  293. - (NSTimeInterval)getDurationOfAudioFile:(NSURL *)fileURL {
  294. NSError *error;
  295. AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithContentsOfURL:fileURL error:&error];
  296. if (error) {
  297. HLog(@"Error: %@", error.localizedDescription);
  298. return 0;
  299. }
  300. return player.duration;
  301. }
  302. #pragma mark 点击了录音
  303. - (void)didClickRecordFun
  304. {
  305. if(_recordingV){
  306. return;
  307. }
  308. //检测麦克风权限
  309. AVAudioSessionRecordPermission permissionStatus = [[AVAudioSession sharedInstance] recordPermission];
  310. // MicrophonePermissionStatus status;
  311. // switch (permissionStatus) {
  312. // case AVAudioSessionRecordPermissionUndetermined:
  313. // status = MicrophonePermissionStatusNotDetermined;
  314. // break;
  315. // case AVAudioSessionRecordPermissionDenied:
  316. // status = MicrophonePermissionStatusDenied;
  317. // break;
  318. // case AVAudioSessionRecordPermissionGranted:
  319. // status = MicrophonePermissionStatusGranted;
  320. // break;
  321. // }
  322. if (permissionStatus == AVAudioSessionRecordPermissionDenied) {
  323. NSString *tip = NSLocalizedString(@"mine_record_microphone_tip",nil);
  324. [[iToast makeText:tip] show];
  325. return;
  326. }
  327. else if(permissionStatus == AVAudioSessionRecordPermissionUndetermined) {
  328. KWeakSelf
  329. [[AVAudioSession sharedInstance] requestRecordPermission:^(BOOL granted) {
  330. dispatch_async(dispatch_get_main_queue(), ^{
  331. if (granted) {
  332. [weakSelf beginRecordFun];
  333. } else {
  334. }
  335. });
  336. }];
  337. return;
  338. }
  339. [self beginRecordFun];
  340. }
  341. #pragma mark 弹起录音功能
  342. - (void)beginRecordFun
  343. {
  344. _recordingV = [[recordingView alloc] init];
  345. [ksharedAppDelegate.window addSubview:_recordingV];
  346. [_recordingV mas_makeConstraints:^(MASConstraintMaker *make) {
  347. make.left.mas_equalTo(0.f);
  348. make.right.mas_equalTo(0.f);
  349. make.bottom.mas_equalTo(0.f);
  350. make.top.mas_equalTo(0);
  351. }];
  352. NSInteger index = _audioArr.count + 1;
  353. [_recordingV beginRecordFunWith:index];
  354. KWeakSelf
  355. _recordingV.didClickRecordEndFun = ^{
  356. [weakSelf deleteRecordingViewFun];
  357. };
  358. }
  359. #pragma mark 删除录音中界面
  360. - (void)deleteRecordingViewFun
  361. {
  362. [_recordingV removeFromSuperview];
  363. _recordingV = nil;
  364. [self getRecordDataFun];
  365. [self.tableView reloadData];
  366. }
  367. #pragma mark 点击cell里面的按钮事件 //index 1 编辑 2 删除 10 播放 11 后退 12 前进
  368. - (void)didClickCellFunBy:(NSInteger)index withRow:(NSInteger)row
  369. {
  370. switch (index) {
  371. case 1:
  372. [self didClickEditFunWithRow:row];
  373. break;
  374. case 2:
  375. [self deleteFileByRow:row];
  376. default:
  377. break;
  378. }
  379. }
  380. #pragma mark 点击编辑
  381. - (void)didClickEditFunWithRow:(NSInteger)row
  382. {
  383. recordFileModel *model = nil;
  384. if (_audioArr.count > row) {
  385. model = _audioArr[row];
  386. }
  387. else{
  388. return;
  389. }
  390. if (_reNameRecordFileV) {
  391. [_reNameRecordFileV removeFromSuperview];
  392. }
  393. _reNameRecordFileV = [[reNameRecordFileView alloc] init];
  394. [ksharedAppDelegate.window addSubview:_reNameRecordFileV];
  395. _reNameRecordFileV.fileName = model.fileName;
  396. [_reNameRecordFileV mas_makeConstraints:^(MASConstraintMaker *make) {
  397. make.left.mas_equalTo(0.0);
  398. make.right.mas_equalTo(0.0);
  399. make.top.mas_equalTo(0.0);
  400. make.bottom.mas_equalTo(0.0);
  401. }];
  402. KWeakSelf
  403. _reNameRecordFileV.didClickOkButtonFun = ^(NSString * _Nonnull newName) {
  404. [weakSelf checkRenameByNewName:newName withRow:row];
  405. };
  406. }
  407. #pragma mark 重命名逻辑
  408. - (void)checkRenameByNewName:(NSString*)newName withRow:(NSInteger)row
  409. {
  410. [_reNameRecordFileV removeFromSuperview];
  411. if (!newName || newName.length == 0) {
  412. NSString *tip = NSLocalizedString(@"record_reName_error_tip",nil);
  413. [[iToast makeText:tip] show];
  414. return;
  415. }
  416. recordFileModel *model = nil;
  417. if (_audioArr.count > row) {
  418. model = _audioArr[row];
  419. }
  420. else{
  421. return;
  422. }
  423. BOOL isRepeatType = NO;
  424. for (int i=0; i<_audioArr.count; i++) {
  425. if (i != row) {
  426. recordFileModel *preModel = _audioArr[i];
  427. if ([preModel.fileName isEqualToString:newName]) {
  428. isRepeatType = YES;
  429. break;
  430. }
  431. }
  432. }
  433. if (isRepeatType) {
  434. NSString *tip = NSLocalizedString(@"record_reName_error_repeat_tip",nil);
  435. [[iToast makeText:tip] show];
  436. return;
  437. }
  438. //[_reNameRecordFileV removeFromSuperview];
  439. // 获取文件管理器
  440. NSFileManager *fileManager = [NSFileManager defaultManager];
  441. // 原始文件路径
  442. NSString *documentsPath = kSHPath_Record;
  443. NSString *oldFilePath = [documentsPath stringByAppendingPathComponent:model.fileName];
  444. // 新文件路径
  445. NSString *newFilePath = [documentsPath stringByAppendingPathComponent:newName];
  446. NSError *error = nil;
  447. // 重命名/移动文件
  448. BOOL success = [fileManager moveItemAtPath:oldFilePath toPath:newFilePath error:&error];
  449. if (!success) {
  450. NSString *tip = NSLocalizedString(@"record_reName_error_title",nil);
  451. [[iToast makeText:tip] show];
  452. } else {
  453. NSString *tip = NSLocalizedString(@"record_reName_ok_title",nil);
  454. [[iToast makeText:tip] show];
  455. model.fileName = newName;
  456. [_tableView reloadData];
  457. }
  458. }
  459. #pragma mark 文件删除弹框
  460. - (void)showDeleteAlearViewFun
  461. {
  462. [self deleteFileByRow:-1];
  463. }
  464. #pragma mark 文件删除
  465. - (void)deleteFileByRow:(NSInteger)row
  466. {
  467. KWeakSelf
  468. /*弹窗提示重启*/
  469. ComontAlretViewController *nextVC = [[ComontAlretViewController alloc] initWithTiTle:NSLocalizedString(@"delete_file_title_msg",nil)
  470. msg:NSLocalizedString(@"delete_file_tip_msg",nil)
  471. imageStr:@""
  472. cancelTitle:NSLocalizedString(@"other_cancel",nil)
  473. okTitle:NSLocalizedString(@"delete_file_title_msg",nil) isOkBtnHighlight:YES
  474. didClickOk:^{
  475. [weakSelf sureDeleteFileByRow:row];
  476. } didClickCancel:^{
  477. }];
  478. nextVC.modalPresentationStyle = UIModalPresentationCustom;
  479. [self presentViewController:nextVC animated:YES completion:^{
  480. nextVC.view.superview.backgroundColor = [UIColor clearColor];
  481. }];
  482. }
  483. #pragma mark 文件删除
  484. - (void)sureDeleteFileByRow:(NSInteger)row
  485. {
  486. if (row == -1) {//删除编辑状态选中的旋转
  487. [self deleteSelectFileFun];
  488. return;
  489. }
  490. recordFileModel *model = nil;
  491. if (_audioArr.count > row) {
  492. model = _audioArr[row];
  493. }
  494. else{
  495. return;
  496. }
  497. NSFileManager *fileManager = [NSFileManager defaultManager];
  498. NSString *filePath = model.filePath; // 获取要删除的文件路径
  499. NSError *error = nil;
  500. BOOL success = [fileManager removeItemAtPath:filePath error:&error];
  501. if (!success) {
  502. //NSLog(@"删除文件失败: %@", error.localizedDescription);
  503. [[iToast makeText:NSLocalizedString(@"record_deleteFile_fail",nil)] show];
  504. } else {
  505. //NSLog(@"文件删除成功");
  506. [[iToast makeText:NSLocalizedString(@"delete_file_suc_msg",nil)] show];
  507. [_audioArr removeObject:model];
  508. recordFileModel *firstModel = _audioArr.firstObject;
  509. firstModel.showAllType = YES;
  510. [_tableView reloadData];
  511. }
  512. }
  513. #pragma mark 删除编辑状态选中的旋转
  514. - (void)deleteSelectFileFun
  515. {
  516. NSFileManager *fileManager = [NSFileManager defaultManager];
  517. for (recordFileModel*delModel in _didSelectListArr) {
  518. NSString *filePath = delModel.filePath; // 获取要删除的文件路径
  519. NSError *error = nil;
  520. BOOL success = [fileManager removeItemAtPath:filePath error:&error];
  521. if (!success) {
  522. //NSLog(@"删除文件失败: %@", error.localizedDescription);
  523. //[[iToast makeText:NSLocalizedString(@"record_deleteFile_fail",nil)] show];
  524. } else {
  525. //NSLog(@"文件删除成功");
  526. //[[iToast makeText:NSLocalizedString(@"delete_file_suc_msg",nil)] show];
  527. [_audioArr removeObject:delModel];
  528. }
  529. }
  530. // recordFileModel *firstModel = _audioArr.firstObject;
  531. // firstModel.showAllType = YES;
  532. [_tableView reloadData];
  533. [[iToast makeText:NSLocalizedString(@"delete_file_suc_msg",nil)] show];
  534. [_didSelectListArr removeAllObjects];
  535. [self setEditTypeTitleFun];
  536. }
  537. #pragma mark 点击了编辑按钮
  538. - (void)didClickEditFun
  539. {
  540. _isEditType = YES;
  541. _curEditTypeHeadView.hidden = NO;
  542. _curEditTypeBottomView.hidden = NO;
  543. _recordBottomV.hidden = YES;
  544. for (recordFileModel*model in _audioArr) {
  545. model.showAllType = NO;
  546. model.isEditType = YES;
  547. }
  548. [self.tableView mas_remakeConstraints:^(MASConstraintMaker *make) {
  549. make.left.mas_equalTo(0);
  550. make.right.mas_equalTo(0);
  551. make.bottom.mas_equalTo(_curEditTypeBottomView.mas_top);
  552. make.top.equalTo(self.navBarBGView.mas_bottom).offset(10.f);
  553. }];
  554. [self.tableView reloadData];
  555. }
  556. #pragma mark 用户取消编辑编辑
  557. - (void)userCancelEditTypeFun
  558. {
  559. //数据还原
  560. for (recordFileModel*model in _didSelectListArr) {
  561. model.isSelectType = NO;
  562. }
  563. [_didSelectListArr removeAllObjects];
  564. for (recordFileModel*model in _audioArr) {
  565. model.isEditType = NO;
  566. }
  567. recordFileModel*firstModel = _audioArr.firstObject;
  568. firstModel.showAllType = YES;
  569. _isEditType = NO;
  570. [self.tableView reloadData];
  571. _curEditTypeHeadView.hidden = YES;
  572. _curEditTypeBottomView.hidden = YES;
  573. _recordBottomV.hidden = NO;
  574. [self.tableView mas_remakeConstraints:^(MASConstraintMaker *make) {
  575. make.left.mas_equalTo(0);
  576. make.right.mas_equalTo(0);
  577. make.bottom.equalTo(self.recordBottomV.mas_top).offset(0.f);
  578. make.top.equalTo(self.navBarBGView.mas_bottom).offset(10.f);;
  579. }];
  580. }
  581. - (void)didClickSelectAllButton:(UIButton*)button
  582. {
  583. //button.selected = !button.selected;
  584. [_didSelectListArr removeAllObjects];
  585. for (recordFileModel* dataModel in _audioArr) {
  586. if(!button.selected){
  587. dataModel.isSelectType = button.selected;
  588. }
  589. else{
  590. [_didSelectListArr addObject:dataModel];
  591. dataModel.isSelectType = button.selected;
  592. }
  593. }
  594. [self.tableView reloadData];
  595. [self setEditTypeTitleFun];
  596. }
  597. - (void)userCheckFilePreviewByRow:(NSInteger)row
  598. {
  599. if(row < _audioArr.count){
  600. recordFileModel* dataModel = _audioArr[row];
  601. if(dataModel.isSelectType){
  602. [_didSelectListArr removeObject:dataModel];
  603. }
  604. else{
  605. [_didSelectListArr addObject:dataModel];
  606. }
  607. dataModel.isSelectType = !dataModel.isSelectType;
  608. [self setEditTypeTitleFun];
  609. }
  610. }
  611. #pragma mark 设置选中标题
  612. - (void)setEditTypeTitleFun
  613. {
  614. [_curEditTypeHeadView setTitleLabetextByNumbers:_didSelectListArr.count];
  615. }
  616. @end