2012-11-16 4 views
0

현재이 자습서를 따라 검색을 구현하려고합니다. http://www.appcoda.com/how-to-add-search-bar-uitableview/ 그러나 나는 앱이 충돌하는 시점에 있지만 어떻게 수정해야하는지 전혀 모른다.TableView에서 검색을 수행 한 후 앱이 다운 됨

내 응용 프로그램에 제공되는 JSON은 현재 데이터베이스에 액세스 할 수 없기 때문에 현재 한 행에 대한 데이터 만 가지고 있습니다 (변경할 수 없습니다).

내 초기보기가 좋아 보인다. TableView 채워집니다 (1 행). 검색 창을 탭하고 해당 항목의 이름이 아닌 문자를 넣으면 정상적인 "결과가 없습니다"라는 메시지가 나타납니다. 항목의 이름에있는 글자를 넣으면 필터링 된 항목이 예상대로 표시됩니다. 그러나, 내가 항목의 이름에 두 번째 문자를 넣을 때, 내 응용 프로그램은 콘솔에서 다음과 같은 출력을 제공합니다.

Terminating app due to uncaught exception 'NSRangeException', reason: '-[__NSCFArray objectAtIndex:]: index (1) beyond bounds (1)' 

내 코드를 입력하십시오. numberOfRowsInSection 메서드가 검색에 따라 수정되었습니다.

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    // Return the number of rows in the section. 
    if (tableView == self.searchDisplayController.searchResultsTableView) { 
     return [searchResults count]; 


    } else { 
     return [[resultSearch valueForKeyPath:@"data.auctions"]count]; 
     } 
} 

numberOfSectionsInTableView는 하나의 섹션 하드 코딩 (새 창 1; 나는 현재 더 필요하지 않는 한)이 이제 내 cellForRowAtIndexPath

을 내 응용 프로그램 충돌 후, 지금

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    { 

     static NSString *simpleTableIdentifier = @"SimpleTableItem"; 
     SimpleTableCell *cell = (SimpleTableCell *)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier]; //custom cell 

     if (cell == nil) 
     { 
      NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"SimpleTableCell" owner:self options:nil]; 
      cell = [nib objectAtIndex:0]; 

     } 


     NSDictionary *aucdict = [jsonAukResultsSearch objectAtIndex:indexPath.row]; //assigning current row from NSMutableArray(jsonAukResultsSearch) to Dictionary, this is probably crash spot 
     NSURL *imageURL = [NSURL URLWithString:[aucdict objectForKey:@"img_url"]]; 
     NSData *result = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; 
//sending request to get picture 
     UIImage *imageLoad = [[UIImage alloc] initWithData:result]; 
     NSString *timeString = [aucdict objectForKey:@"time_left"]; 
     NSString *priceString = [aucdict objectForKey:@"current_value"]; 


     // Configure the cell... 
     if (tableView == self.searchDisplayController.searchResultsTableView) { 
      cell.textLabel.text = [searchResults objectAtIndex:indexPath.row]; 
     } else { 
      cell.nameLabel.text = [aucdict objectForKey:@"name"]; 
     } 

     //cell.thumbnailImageView.image = imageLoad; 
     //commented while crashes are happening 


     return cell; 
    } 

을 내

NSDictionary *aucdict = [jsonAukResultsSearch objectAtIndex:indexPath.row]; 

형광펜입니다, 그래서 아마도, 장소, indexPath 파 rameter는 범위를 벗어났다. 나는 정말로 어떻게 인덱스 (1)가 경계 (1)를 넘을 수 있는지 이해하지 못한다. 알아요. 검색 문안에 따라 0 개 또는 하나의 행만 반환합니다.

난 그냥 오늘 검색 작업을 시작, 그래서 어떤 단서가없는, 그 까다로운 지점이 무엇인지 .. 어떤 제안은 감사합니다 :) 감사합니다, Yanchi

편집 : 좋아, 그래서 나는 곳을 발견 내 문제가있을 수 있습니다 ... 나는이 질문 맨 위에 언급 된 튜토리얼을 자세히 따르고 있습니다 ..이 메서드는 검색 결과 배열을 반환하기로되어 있습니다. 당신이 볼 수있는

- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope 
{ 

    NSPredicate *resultPredicate = [NSPredicate 
            predicateWithFormat:@"SELF contains[cd] %@", 
            searchText]; 

    searchResults = [poleMien filteredArrayUsingPredicate:resultPredicate]; 
    NSLog(@"%u",[searchResults count]); 
} 

나는 (그것이 있어야로) 나의 필터링 된 결과는 문제없이 표시됩니다 내가 일치하는 첫 글자를 추가 할 때 이제 콘솔 출력이 1 인 ... NSLog를 추가했다. 그러나 다른 일치하는 문자를 입력하면 내 searchResults 배열이 2로 증가하고 ("일치하는"문자를 계산하는 것처럼) 이유가있을 것입니다. 왜 충돌이 발생합니까? 내 searchResults 배열의 항목)

그 후 배열의 내용을 표시하기 위해 NSLog를 변경했습니다. 일치하는 글자를 삽입 한 후 동일한 항목이 내 배열에 추가됩니다 (따라서 배열에 다른 항목이 있으므로 동일한 데이터를가집니다. 내 배열의 첫 번째 항목으로

EDIT 2 : 그럼 내 문제는, 내가 사전에 배열에서 json 데이터를 저장 해요 (그래서 내가 필터링 결과에 대한 배열을 사용할 수 있습니다) 내가 cellForRowAtIndexPath에서 할 .. 그래서 내 배열은 매번 동일한 값이로드되고, 검색 테이블은 "다시 채워진다".. 이제 나는 어떤 방법으로 t를 찾을 필요가있다. o 다른 항목 인 경우에만 배열에 데이터를로드합니다.

+0

음, 인덱스 (1) NSArray를 그것에 하나 개의 요소 만 인덱스에있는 요소를 가지고 있어야하기 때문에 (1) 경계를 넘어 (0을 보여 주었다). 따라서 테이블 뷰는 하나의 요소 (인덱스 0)가있을 때/second/요소 (인덱스 1)에 대한 데이터 소스를 요청합니다. 테이블 뷰는 행이 하나뿐이라는 것을 알고있는 경우이를 수행하지 않아야합니다. 프로그램의 어딘가에 중단 점을 설정하고 tableview가 무엇을 반환하는지 볼 수 있습니까? [UITableView numberOfSections] - [UITableView numberOfRowsInSection :] 그리고 예상 한 값인지 확인하십시오. – eyebrowsoffire

+0

내 문제는, 어디서 중단 점을 설정할 지 모르겠다 ... breakpoint는 실제로 searchBar에 뭔가를 넣을 기회를 갖기 전에 도달한다. (왜냐하면 모든 항목을 가진 내 tableview가 미리로드 될 것이기 때문이다.) 그 수는 nslog이지만 그 수는 콘솔에 표시되지 않습니다. – Yanchi

+0

나는이 문제를 해결할 수있을 것으로 생각합니다. My - (void) filterContentForSearchText : (NSString *) searchText 범위 : (NSString *) scope는 내 배열을 더 많은 인덱스로 채 웁니다. searchBar에 편지를 추가합니다 – Yanchi

답변

0

마지막으로 나는 무엇이 잘못되었는지 알아 냈습니다. json 응답의 이름 필드를 배열에 저장하고있었습니다.내 배열이 cellForRowAtIndexPath에서 업데이트되었으므로 검색 결과에 일치하는 두 글자를 입력 한 후 결과가 배열에 두 번 저장되었습니다 (따라서 배열에 두 개의 동일한 항목이 있음). 따라서 색인이 범위를 벗어 났으므로 충돌이 발생했습니다. .

내 배열에 동일한 값이 들어 있는지 확인하고 고유 값을 이와 같은 다른 배열에 저장하여이를 복구했습니다.

newarray = [[NSMutableArray alloc] init]; 
    NSString *laststring = nil; 
    for (NSString *currentstring in poleMien) 
    { 
     if (![currentstring isEqualToString:laststring]) [newarray addObject:currentstring]; 
     laststring = currentstring; 
    } 

감사 eyebrowsoffire, 당신은 나에게 올바른 방법 :

관련 문제