NSPredicate与iOS中的NSURL崩溃

时间:2014-06-02 07:12:46

标签: ios uitableview nsmutablearray nspredicate nsurl

我需要使用UISearchBar搜索位于文档目录中的pdf文件。

我正在使用此方法从文档目录加载PDF以显示在UITableView

- (NSArray *)loadBookFromDocumentDirectory
{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [NSString stringWithFormat:@"%@",[paths objectAtIndex:0]];

    NSFileManager *manager = [NSFileManager defaultManager];

    NSError *error;

    NSArray *files = [manager contentsOfDirectoryAtURL:[NSURL fileURLWithPath:documentsDirectory]
                            includingPropertiesForKeys:[NSArray arrayWithObject:NSURLContentModificationDateKey]
                                               options:NSDirectoryEnumerationSkipsHiddenFiles

                                                 error:&error];
    NSArray* sortArray = [files sortedArrayUsingComparator:
                      ^(NSURL *file1, NSURL *file2)
                      {
                          NSDate *file1Date;
                          [file1 getResourceValue:&file1Date forKey:NSURLContentModificationDateKey error:nil];

                          NSDate *file2Date;
                          [file2 getResourceValue:&file2Date forKey:NSURLContentModificationDateKey error:nil];

                          return [file2Date compare: file1Date];
                      }];

    return sortArray;
}

我可以在UITableView中成功显示所有pdf文档。但是,当我尝试使用以下代码进行搜索时,我的应用程序崩溃并显示此消息。

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Can't use in/contains operator with collection file:///Users/User/Library/Application%20Support/iPhone%20Simulator/7.1-64/Applications/D0191F36-D11A-47DF-9274-BE2C72B9C8E1/Documents/%E1%80%B1%E1%80%A1%E1%80%AC%E1%80%B9%E1%80%90%E1%80%AD%E1%80%AF%20Desk%203D%20%E1%80%B1%E1%80%9C%E1%80%B7%E1%80%80%E1%80%BA%E1%80%84%E1%80%B7%E1%80%B9%E1%80%81%E1%80%94%E1%80%B9%E1%80%B8.pdf (not a collection)'

以下是textDidChange事件中的代码。

self.filterArray = [[NSMutableArray alloc] init];
        [self.filterArray removeAllObjects];

        NSPredicate *filter = [NSPredicate predicateWithFormat:@"self Contains[cd] %@",searchText];

        self.filterArray = (NSMutableArray *)[self.arrayOfBooks filteredArrayUsingPredicate:filter];

这是UITableViewCell代码。

NSURL *url = [self.filterArray objectAtIndex:indexPath.row];

        cell.textLabel.text = [[[[url absoluteString] lastPathComponent] stringByReplacingOccurrencesOfString:@"+" withString:@" "] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

我该如何解决?请帮帮我。

1 个答案:

答案 0 :(得分:2)

我猜您需要将URL更改为字符串才能运行谓词。尝试:

[NSPredicate predicateWithFormat:@"absoluteString Contains[cd] %@",searchText];

我知道您希望网址开头,以便您可以缓存日期,但之后您似乎只需要字符串,因此您可以在valueForKey:@"absoluteString"上使用sortArray,然后您就不需要了担心后续代码中的URL转换。