iOS - 数组中的skipHiddenFiles仍然需要修复

时间:2016-09-27 00:58:20

标签: ios objective-c arrays uitableview

我的问题:我已经在这个论坛上搜索了这个话题 (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:

    (     “.DS_Store”,
        “audio 1.caf”,
        “audio 10.caf”,
        “audio 2.caf”,
        “audio 3.caf”,
        “audio 4.caf”,
        “audio 5.caf”,
        “audio 6.caf”,
        “audio 7.caf”,
        “audio 8.caf”,
        “audio 9.caf” )

注意在填充的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列表在下面的图片中发布)

RG_tableview array image

1 个答案:

答案 0 :(得分:0)

filteredArrayUsingPredicate:返回一个新的数组实例;它不会修改它给出的数组。它不是NSMutableArray。 (命名遵循方法-sortedArrayUsingSelector:中的模式,它返回一个新数组; NSMutableArray方法是-sortUsingSelector:,带有void返回值 - 一个描述返回值,后者是修改接收者的操作)。

因此...

_audioFileArray = [_audioFileArray filteredArrayUsingPredicate:predicate];

第二个问题是-pathExtension方法返回一个不包括扩展分隔符本身的字符串 - 所以只是" caf"在你的情况下。

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"pathExtension='caf'"];

之后它应该工作。注意-contentsOfDirectoryAtPath:返回NSString文件名; -contentsOfDirectoryAtURL:返回完整的文件:// NSURL实例。