현재이 자습서를 따라 검색을 구현하려고합니다. 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 다른 항목 인 경우에만 배열에 데이터를로드합니다.
음, 인덱스 (1) NSArray를 그것에 하나 개의 요소 만 인덱스에있는 요소를 가지고 있어야하기 때문에 (1) 경계를 넘어 (0을 보여 주었다). 따라서 테이블 뷰는 하나의 요소 (인덱스 0)가있을 때/second/요소 (인덱스 1)에 대한 데이터 소스를 요청합니다. 테이블 뷰는 행이 하나뿐이라는 것을 알고있는 경우이를 수행하지 않아야합니다. 프로그램의 어딘가에 중단 점을 설정하고 tableview가 무엇을 반환하는지 볼 수 있습니까? [UITableView numberOfSections] - [UITableView numberOfRowsInSection :] 그리고 예상 한 값인지 확인하십시오. – eyebrowsoffire
내 문제는, 어디서 중단 점을 설정할 지 모르겠다 ... breakpoint는 실제로 searchBar에 뭔가를 넣을 기회를 갖기 전에 도달한다. (왜냐하면 모든 항목을 가진 내 tableview가 미리로드 될 것이기 때문이다.) 그 수는 nslog이지만 그 수는 콘솔에 표시되지 않습니다. – Yanchi
나는이 문제를 해결할 수있을 것으로 생각합니다. My - (void) filterContentForSearchText : (NSString *) searchText 범위 : (NSString *) scope는 내 배열을 더 많은 인덱스로 채 웁니다. searchBar에 편지를 추가합니다 – Yanchi