-4

在 searchBar 中,我有以下代码

- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar
{
    [searchBar resignFirstResponder];
    self.filteredResults = [[NSMutableArray alloc] init];
    NSPredicate* predicate = [NSPredicate predicateWithFormat:@"(%K == %@)", field1, field2];
    self.filteredResults = (NSMutableArray *)[originalArray filteredArrayUsingPredicate:predicate];
}

编辑:

- (BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar
{
    originalArray = [[NSArray alloc] initWithContentsOfFile:path];
    返回是;
}

在我第二次运行谓词时,程序在消息中的分配处self.fiteredResults崩溃searchBarSearchButtonClicked:searchBar。如果我包含[self.filteredResults removeAllObjects],那么程序会在那里崩溃,所以它被删除了,但在第二次执行搜索时它仍然无法运行。此代码中的任何内容是否会导致崩溃,或者我应该寻找其他地方吗?提前致谢。

4

3 回答 3

1

这一行:

originalArray = [[NSFileManager defaultManager] fileExistsAtPath:path];

因为您试图将 a 设置BOOL为数组属性。


您应该制作数组的可变副本:

self.filteredResults = [[originalArray filteredArrayUsingPredicate:predicate] mutableCopy];
于 2013-07-29T20:04:24.870 回答
0

原始数组被正确分配,

完整的工作代码:

- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar
{
    [searchBar resignFirstResponder];

    NSString* 文档目录 = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    NSString* path = [documentsDirectory stringByAppendingPathComponent:@"plist.plist"];

    if ([[NSFileManager defaultManager] fileExistsAtPath:path]) {
        self.arrayFromCloud = [[NSArray alloc] initWithContentsOfFile:path];
    }

    eventFromCloud = [[NSMutableArray alloc] init];

    for (NSDictionary* dic in self.arrayFromCloud) {
        [eventFromCloud addObject:[dic valueForKey:@"event"]];
    }

    [eventFromCloud removeObjectAtIndex:0];

    self.filteredResults = [[NSMutableArray alloc] init];

    searchBar.placeholder = @"搜索";

    // 使用 NSPredicate 过滤数组
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(%K == %@)", @"场地名称", @"starbucks"];
    self.filteredResults = [[eventFromCloud filteredArrayUsingPredicate:predicate] mutableCopy];

    searchBar.text = nil;
    self.arrayFromCloud = nil;
    eventFromCloud = nil;
    self.filteredResults = nil;

}

我让这段代码工作的唯一方法是必须分配/初始化中间数组和结果数组,以便第二次在搜索中使用。最初甚至没有想到可能是他们造成了这个错误。

于 2013-07-29T20:54:20.680 回答
-1

您编写谓词的方式存在问题。数组中的对象不包含“field1”属性。

于 2013-07-29T20:32:56.857 回答