我的问题:我已经在这个论坛上搜索了这个话题 (i.e.:Getting a list of files in a directory with a glob), 但仍然面临一些挑战。
使用Objective-C,我使用存储在iOS根目录“documents directory”中的文件数组填充tableview。
文件是.caf音频文件(即: audio_1.caf,audio_2.caf 等)。 我正在使用NSArray _audioFileArray列出UITableview单元格中的文件。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *simpleTableIdentifier = @"simpleTableItem";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleValue2 reuseIdentifier:simpleTableIdentifier];
}
//add the text display that is drawn from the array list
cell.textLabel.text = [_audioFileArray objectAtIndex:indexPath.row];
//cell.textLabel.text = [NSString stringWithFormat:@"%@.!!", _audioFileArray];
return cell;
}
控制台打印出这个数组是:
2016-09-25 18:27:08.278 NewAudioPlayerTest [3349:60b] AudioFileArray check:
注意在填充的tableview的NSLog中还显示 .DS_Store 不可见的文件,我不想要,只需要音频文件以备将来播放回来。
我尝试使用谓词过滤器但没有成功,并使用“NSDirectoryEnumerationSkipsHiddenFiles”方法和一些结果。 如果我NSLog为这个方法的结果,作为一个数组, 我得到了文件和扩展名的错误版本,以及控制台中的整个URL,如下所示......
**"file:///Users/aName/Library/Developer/CoreSimulator/Devices/D144B87B-F1A6-460E-9628-5C203396B60D/data/Applications/C85E57DD-E183-48C5-8D64-F9C497E9AA2E/Documents/audio%201.caf",
"file:///Users/aName/Library/Developer/CoreSimulator/Devices/D144B87B-F1A6-460E-9628-5C203396B60D/data/Applications/C85E57DD-E183-48C5-8D64-F9C497E9AA2E/Documents/audio%202.caf",**
..等等。
我的DetailViewController.m文件中处理所有这些代码的大部分代码是:
@interface FileViewController ()
@end
@implementation FileViewController
int count;
@synthesize fileArray = _fileArray;
@synthesize fileName = _fileName;
@synthesize audioFileArray = _audioFileArray;
@synthesize contents = _contents;
@synthesize fileURL = _fileURL;
- (void)viewDidLoad {
[super viewDidLoad];
NSFileManager *fileManager = [NSFileManager defaultManager];
_audioFileArray = [[NSMutableArray alloc] init];
_fileName = [NSString stringWithFormat:@"audio %d", count];
NSArray *paths = [NSArray arrayWithObjects: [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject],
_fileName,
nil];
NSString *documentsDirectory = [paths objectAtIndex:0];
// WORKS with this, but whole mangled URL ——>
_fileURL = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@",[paths objectAtIndex:0]]];
NSError *error = nil;
///—> not working!!
_audioFileArray = [fileManager contentsOfDirectoryAtPath:documentsDirectory error:&error];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"pathExtension='.caf'"];
[_audioFileArray filteredArrayUsingPredicate:predicate];
_contents = [fileManager contentsOfDirectoryAtURL:_fileURL includingPropertiesForKeys: [NSArray arrayWithObject:NSURLNameKey] options:NSDirectoryEnumerationSkipsHiddenFiles error:nil];
NSArray *theFiles = [fileManager contentsOfDirectoryAtURL:[NSURL fileURLWithPath:[paths objectAtIndex:0]]
includingPropertiesForKeys:[NSArray arrayWithObject:NSURLNameKey]
options:NSDirectoryEnumerationSkipsHiddenFiles
error:nil];
NSLog(@“skipHiddenFiles log ---> %@“,_contents);
NSLog(@"now predicate ---> %@",predicate);
这段代码可能看起来有点混乱,(是的,对不起) 我当然想要的是使用过滤掉隐藏文件的NSArray _audioFileArray实例方法。 欢迎提出任何解决方案和建议,以便最好地解决这个问题并使过滤工作,以及我在这里遇到的错误。
谢谢。 (我的数组的tableView列表在下面的图片中发布)
答案 0 :(得分:0)
filteredArrayUsingPredicate:返回一个新的数组实例;它不会修改它给出的数组。它不是NSMutableArray。 (命名遵循方法-sortedArrayUsingSelector:中的模式,它返回一个新数组; NSMutableArray方法是-sortUsingSelector:,带有void返回值 - 一个描述返回值,后者是修改接收者的操作)。
因此...
_audioFileArray = [_audioFileArray filteredArrayUsingPredicate:predicate];
第二个问题是-pathExtension方法返回一个不包括扩展分隔符本身的字符串 - 所以只是" caf"在你的情况下。
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"pathExtension='caf'"];
之后它应该工作。注意-contentsOfDirectoryAtPath:返回NSString文件名; -contentsOfDirectoryAtURL:返回完整的文件:// NSURL实例。