사용자가 수행 한 검색에서 UITableView의 결과를 표시 할 때 아래 오류가 발생합니다. 아래 코드는 검색 및 필터링이며 결과를 표시해야합니다. (하지만 그렇지 않습니다)사용자 검색에서 UITableView의 결과를 표시하는 중 생성 오류가 발생했습니다.
@implementation ProductsViewController
{
NSPredicate *searchSearch;
NSArray *results;
}
@synthesize bakeryTableView, bakeryProductArray, searchResults, itemName;
-(void)viewDidLoad
{
bakeryProductArray = [[NSMutableArray alloc]init];
searchResults = [[NSArray alloc]init];
[self testermethod];
[[self navigationController] setNavigationBarHidden:NO];
[super viewDidLoad];
}
-(void)testermethod
{
PFQuery *query = [PFQuery queryWithClassName:self.parseClassName];
// Retrieve the top songs by sales
[query orderByAscending:@"Name"];
// Limit to retrieving ten songs
query.limit = 100;
[query findObjectsInBackgroundWithBlock:^(NSArray *food, NSError *error) {
if (error) return;
// Songs now contains the last ten songs, and the band field has
// been populated. For example:
for (PFObject *song in food) {
PFObject *simple = [song objectForKey:@"Name"];
[bakeryProductArray addObject: simple];
}
[bakeryTableView reloadData];
return;
NSLog(@"Passed");
}];
}
-(id)initWithCoder:(NSCoder *)aCoder {
self = [super initWithCoder:aCoder];
if (self) {
self.parseClassName = @"JackiesBakeryProducts";
self.textKey = @"objectid";
self.pullToRefreshEnabled = YES;
self.paginationEnabled = NO;
// self.objectsPerPage = 20;
}
return self;
}
-(PFQuery *)queryForTable
{
PFQuery *query = [PFQuery queryWithClassName:self.parseClassName];
// If no objects are loaded in memory, we look to the cache first to fill the table
// and then subsequently do a query against the network.
if ([self.objects count] == 0) {
query.cachePolicy = kPFCachePolicyCacheThenNetwork;
}
[query orderByAscending:@"Name"];
return query;
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
//Fill table in with data
static NSString *cellIdentifier = @"Cell";
PFObject *selectedObject = [self objectAtIndexPath:indexPath];
NSLog(@"%@", selectedObject);
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellIdentifier];
}
if (tableView == self.searchDisplayController.searchResultsTableView) {
NSString *selectedObject = [searchResults objectAtIndex:indexPath.row];
NSLog(@"%i", searchResults.count);
cell.textLabel.text = selectedObject;
}
else {
NSString *productName = [selectedObject objectForKey:@"Name"];
NSString *productQuantity = [selectedObject objectForKey:@"Quantity"];
cell.textLabel.text = productName;
cell.detailTextLabel.text = productQuantity;
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
}
return cell;
}
#pragma mark - UITableView Delegate methods
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
//Deal with user search from tableview
if (bakeryTableView == self.searchDisplayController.searchResultsTableView)
{
[self performSegueWithIdentifier: @"bakeryDetails" sender:self];
}
//Prep the next view controller with data from current view (data passing)
detailedViewController *productinfo = [self.storyboard instantiateViewControllerWithIdentifier:@"bakeryDetails"];
PFObject *selectedObject = [self objectAtIndexPath:indexPath];
productinfo.productName = [selectedObject objectForKey:@"Name"];
productinfo.productImage = [selectedObject objectForKey:@"ImageUrl"];
productinfo.productDescription = [selectedObject objectForKey:@"Description"];
productinfo.productPrice = [selectedObject objectForKey:@"Price"];
productinfo.productQuantity = [selectedObject objectForKey:@"Quantity"];
productinfo.productAllergy = [selectedObject objectForKey:@"Allergy"];
[self.navigationController pushViewController:productinfo animated:YES];
[bakeryTableView deselectRowAtIndexPath:indexPath animated:YES];
}
//Becareful here as wrong predicateWithFormat can crash app on keying in search
-(void)filterContentForSearchText:(NSString *)searchText scope:(NSString *)scope
{
searchSearch = [NSPredicate predicateWithFormat:@"self CONTAINS[cd] %@",searchText];
searchResults = [bakeryProductArray filteredArrayUsingPredicate:searchSearch];
NSLog(@"Filtered Food Product Count --> %d",[searchResults count]);
NSLog(@"%@", searchResults);
}
-(BOOL)searchDisplayController:(UISearchDisplayController *)controller
shouldReloadTableForSearchString:(NSString *)searchString
{
[self filterContentForSearchText:searchString
scope:[[self.searchDisplayController.searchBar scopeButtonTitles]
objectAtIndex:[self.searchDisplayController.searchBar
selectedScopeButtonIndex]]];
return YES;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
// Check to see whether the normal table or search results table is being displayed and return the count from the appropriate array
if (tableView == self.searchDisplayController.searchResultsTableView)
{
return [searchResults count];
}
else
{
return [bakeryProductArray count];
}
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
위의 코드를 사용하십시오. 으로 오류가 발생합니다. * 캐치되지 않은 예외 'NSRangeException'으로 인해 응용 프로그램을 종료합니다. 이유 : '* - [__ NSArrayI objectAtIndex :] : 경계 1을 넘어서서 인덱스 0 [0]' 문자가 입력 되었으나 두 번째 문자와 충돌 함)
index.row마다 NSArray가 올바르게 작동하지 않는다는 대략적인 생각이 있습니다. 그러나 나는 이걸 어떻게 넘어야할지 모르겠다.
searchResults에서 발생한 일을보고하기 위해 @try - catch 문을 사용했습니다. 그것은이
2013-09-08 13:27:20.876 jackies[995:c07] Filtered Food Product Count --> 1
2013-09-08 13:27:20.876 jackies[995:c07] Aero
2013-09-08 13:27:20.877 jackies[995:c07] Caught this (
Aero
)
2013-09-08 13:27:20.877 jackies[995:c07] Caught this (
Aero
)
2013-09-08 13:27:20.877 jackies[995:c07] Caught this (
Aero
)
2013-09-08 13:27:20.877 jackies[995:c07] Caught this (
Aero
)
2013-09-08 13:27:20.877 jackies[995:c07] Caught this (
Aero
)
2013-09-08 13:27:20.877 jackies[995:c07] Caught this (
Aero
)
2013-09-08 13:27:20.878 jackies[995:c07] Caught this (
Aero
)
2013-09-08 13:27:20.878 jackies[995:c07] Caught this (
Aero
)
2013-09-08 13:27:32.550 jackies[995:c07] Filtered Food Product Count --> 1
2013-09-08 13:27:32.551 jackies[995:c07] Aero
2013-09-08 13:27:32.551 jackies[995:c07] Caught this (
Aero
)
2013-09-08 13:27:32.551 jackies[995:c07] Caught this (
Aero
)
2013-09-08 13:27:32.551 jackies[995:c07] Caught this (
Aero
)
2013-09-08 13:27:32.552 jackies[995:c07] Caught this (
Aero
)
2013-09-08 13:27:32.552 jackies[995:c07] Caught this (
Aero
)
2013-09-08 13:27:32.552 jackies[995:c07] Caught this (
Aero
)
2013-09-08 13:27:32.552 jackies[995:c07] Caught this (
Aero
)
2013-09-08 13:27:32.552 jackies[995:c07] Caught this (
Aero
)
2013-09-08 13:27:34.188 jackies[995:c07] Filtered Food Product Count --> 1
2013-09-08 13:27:34.189 jackies[995:c07] Aero
2013-09-08 13:27:34.189 jackies[995:c07] Caught this (
Aero
)
2013-09-08 13:27:34.189 jackies[995:c07] Caught this (
Aero
)
2013-09-08 13:27:34.189 jackies[995:c07] Caught this (
Aero
)
2013-09-08 13:27:34.189 jackies[995:c07] Caught this (
Aero
)
2013-09-08 13:27:34.189 jackies[995:c07] Caught this (
Aero
)
2013-09-08 13:27:34.190 jackies[995:c07] Caught this (
Aero
)
2013-09-08 13:27:34.190 jackies[995:c07] Caught this (
Aero
)
2013-09-08 13:27:34.190 jackies[995:c07] Caught this (
Aero
)
어떤 도움이 좋을 것 생산했다.
PFObject selectedObject * = [자기 objectAtIndexPath : indexPath]; [selectedObject objectForKey : @ "Name"];으로 차례로 사용됩니다. Parse.com에서 백엔드 데이터베이스의 개별 키 객체를 가져옵니다. – Evilelement