NSPredicate 一直让我的应用程序崩溃
NSPredicate keeps crashing my app
我创建了一个 SearchBar,用于过滤我设置的 UITableView。我正在使用 Parse.com 将此数组下拉到我的应用程序中。
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
[self Query];
//[self.searchDisplayController.searchResultsTableView registerNib:[UINib nibWithNibName:@"SearchCell" bundle:nil] forCellReuseIdentifier:@"SearchData"];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
-(void)Query {
PFQuery *Q = [PFQuery queryWithClassName:@"_User"];
[Q selectKeys:@[@"username"]];
[Q findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
if (!error) {
NSLog(@"load Array);
SearhArray = [[NSArray alloc] initWithArray:objects];
}
else{
NSLog(@"Array No Good");
}
}];
}
然后我尝试使用这些代码行过滤数组
-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText {
self.searchTerm = searchText;
}
-(void)searchBarCancelButtonClicked:(UISearchBar *)searchBar {
[self.mySearchBar resignFirstResponder];
//reset to the original array and reload table
self.filteredCities = SearhArray;
[self.myTableView reloadData];
}
-(void)searchBarSearchButtonClicked:(UISearchBar *)searchBar {
[self.mySearchBar resignFirstResponder];
if ([self.searchTerm isEqualToString:@""]) {
// Nothing to do here - Reset to the original array and reload table
self.filteredCities = SearhArray;
} else {
// Filter the array based on the term searched for using a predicate
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF.title contains[c] %@",self.searchTerm];
self.filteredCities = [NSArray arrayWithArray:[SearhArray filteredArrayUsingPredicate:predicate]];
}
[self.myTableView reloadData];
}
-(void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar {
self.filteredCities = SearhArray;
[self.myTableView reloadData];
}
但它一直在崩溃。我已经将问题调试到这一行
self.filteredCities = [NSArray arrayWithArray:[SearhArray filteredArrayUsingPredicate:predicate]];
我得到的错误是:
`2015-03-31 19:31:19.783 Pondu[59307:5149459] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Key "words" has no data. Call fetchIfNeeded before getting its value.'
*** First throw call stack:
(0x18724a59c 0x1979a00e4 0x18724a4dc 0x1000c34bc 0x1880350f0 0x18807b934 0x18807b394 0x18807a084 0x188079e58 0x1000b31b0 0x18be207ac 0x18ba30d34 0x18ba19e48 0x18bbf91dc 0x18bbc3f04 0x18bd80890 0x18bd80540 0x18ba24950 0x18811ddf0 0x1872029ec 0x187201c90 0x1871ffd40 0x18712d0a4 0x1902cf5a4 0x18ba623c0 0x1000b1f64 0x19800ea08)
Libc++abi.dylib: terminating with uncaught exception of type NSException`
self.searchTerm 看起来像 NSString,但你所放的是你假设该值是 NSDictionary。你需要使用类似
@"SELF MATCHES %@"
,不是
@"SELF.title MATCHES %@"
我创建了一个 SearchBar,用于过滤我设置的 UITableView。我正在使用 Parse.com 将此数组下拉到我的应用程序中。
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
[self Query];
//[self.searchDisplayController.searchResultsTableView registerNib:[UINib nibWithNibName:@"SearchCell" bundle:nil] forCellReuseIdentifier:@"SearchData"];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
-(void)Query {
PFQuery *Q = [PFQuery queryWithClassName:@"_User"];
[Q selectKeys:@[@"username"]];
[Q findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
if (!error) {
NSLog(@"load Array);
SearhArray = [[NSArray alloc] initWithArray:objects];
}
else{
NSLog(@"Array No Good");
}
}];
}
然后我尝试使用这些代码行过滤数组
-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText {
self.searchTerm = searchText;
}
-(void)searchBarCancelButtonClicked:(UISearchBar *)searchBar {
[self.mySearchBar resignFirstResponder];
//reset to the original array and reload table
self.filteredCities = SearhArray;
[self.myTableView reloadData];
}
-(void)searchBarSearchButtonClicked:(UISearchBar *)searchBar {
[self.mySearchBar resignFirstResponder];
if ([self.searchTerm isEqualToString:@""]) {
// Nothing to do here - Reset to the original array and reload table
self.filteredCities = SearhArray;
} else {
// Filter the array based on the term searched for using a predicate
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF.title contains[c] %@",self.searchTerm];
self.filteredCities = [NSArray arrayWithArray:[SearhArray filteredArrayUsingPredicate:predicate]];
}
[self.myTableView reloadData];
}
-(void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar {
self.filteredCities = SearhArray;
[self.myTableView reloadData];
}
但它一直在崩溃。我已经将问题调试到这一行
self.filteredCities = [NSArray arrayWithArray:[SearhArray filteredArrayUsingPredicate:predicate]];
我得到的错误是:
`2015-03-31 19:31:19.783 Pondu[59307:5149459] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Key "words" has no data. Call fetchIfNeeded before getting its value.'
*** First throw call stack:
(0x18724a59c 0x1979a00e4 0x18724a4dc 0x1000c34bc 0x1880350f0 0x18807b934 0x18807b394 0x18807a084 0x188079e58 0x1000b31b0 0x18be207ac 0x18ba30d34 0x18ba19e48 0x18bbf91dc 0x18bbc3f04 0x18bd80890 0x18bd80540 0x18ba24950 0x18811ddf0 0x1872029ec 0x187201c90 0x1871ffd40 0x18712d0a4 0x1902cf5a4 0x18ba623c0 0x1000b1f64 0x19800ea08)
Libc++abi.dylib: terminating with uncaught exception of type NSException`
self.searchTerm 看起来像 NSString,但你所放的是你假设该值是 NSDictionary。你需要使用类似
@"SELF MATCHES %@"
,不是
@"SELF.title MATCHES %@"