2013-07-29 2 views
-4

, 나는 다음과 같은 한 코드자 NSPredicate 검색 창에서 충돌

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

편집 : 술어의 searchBarSearchButtonClicked:searchBar 메시지 self.fiteredResults의 할당에서 프로그램이 충돌을 실행하는 두 번째 시간에

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

. [self.filteredResults removeAllObjects]을 포함하면 프로그램이 충돌하여 제거되고 두 번째로 검색이 수행되지 않습니다. 이 코드의 어떤 것도 충돌을 일으키거나 다른 곳에서 볼 수 있어야합니까? 미리 감사드립니다.

+0

'BOOL'을 NSArray에 할당하면 어떤 결과가 기대됩니까? 컴파일러가 너 한테 소리 지르는거야? –

+0

이 질문에 잘못된 코드를 적었습니다. 그래서 배열 할당을 - (void) delegate 메서드로 옮기고 두 번째로는 여전히 오류가 발생합니다. alloco/init 배열을 원한 후에 오타가 있음을 알았지 만 이미 그렇게하고 있습니다! – aug2uag

+0

@ 중탄산염 NSArray에 BOOL을 할당하면 코드가 컴파일되지 않습니다 – aug2uag

답변

1

이 줄 :

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

당신이 배열 속성에 BOOL을 설정하기 위해 노력하고 있기 때문에.

self.filteredResults = [[originalArray filteredArrayUsingPredicate:predicate] mutableCopy]; 
+1

당신의 과제 "self.filteredResults = [[NSMutableArray alloc] init];" 낭비입니다. 빈 배열을 "filteredResults"에 할당하면 사용하지 않고 나중에 두 줄을 덮어 씁니다. 또한 filteredArrayUsingPredicate의 결과를 NSMutableArray로 캐스팅하지 않아야합니다. 이 메서드는 NSArray를 반환합니다. 가변 배열이 필요하면 결과에 mutableCopy를 호출하십시오. –

+0

내 질문에 수정 된 다른 UISearchBar 대리자 메서드에 할당을 얻기 위해 코드를 조정하고 버그가 지속됩니다 – aug2uag

+0

@ Nicholas, alloc init resultsArray를 덮어 씁니다. 결과가 그 배열에 남아 있기를 원하지 않습니다. – aug2uag

-1

당신이 당신의 술어를 작성하는 방법에 문제가 있습니다 :


당신은 배열의 변경 가능한 복사본을 만들어야합니다. 배열의 객체에는 "field1"속성이 없습니다. 원래의 배열을 올바르게 할당되고 있었다

+0

처음에는 일들에 대해 감사 드린다.하지만 그게 문제라고 생각하지 않는다. – aug2uag

+0

예외가 정확히 무엇이 잘못되었는지 알려주고있다. NSPredicate에 "field1"이라는 키를 기준으로 필터링하도록 지시하고 있으며 배열의 일부 객체가 "field1"에 대해 키 - 값을 준수하지 않기 때문에 시스템이이를 수행 할 수 없다고 말합니다 (즉 : 해당 속성 또는 키가 배열의 하나 이상의 객체에 없습니다). –

+0

코드가 처음으로 아무 문제없이 실행되면 다시 실행하고 코드가 처음 실행될 때 동일한 원본 배열에 동일한 할당이 동시에 발생하는 동안 오류가 발생합니다. 귀하의 의견에 감사드립니다. – aug2uag

0

, 작업에 대한

전체 코드는 :

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

    NSString* documentsDirectory = [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 = @"SEARCH"; 

    // Filter the array using NSPredicate 
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(%K == %@)", @"venue name", @"starbucks"]; 
    self.filteredResults = [[eventFromCloud filteredArrayUsingPredicate:predicate] mutableCopy]; 

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

} 

나는 일에이 코드를 가지고있는 유일한 방법은 중간 배열 및 결과 배열 초기화/ALLOC 필요로했다 검색에서 두 번째로 사용됩니다. 원래 그것이 벌레를 일으키는 원인이 될 수도 있다는 것을 알지 못했습니다.