我有一个工作表视图控制器,它根据与前一个表视图控制器对应的xml文件进行填充。在我尝试添加UISearchDisplayController.
在完成一些教程后,我尝试实现他们的代码,但我的应用程序一直崩溃,出现以下错误:
**由于未捕获的异常'NSUnknownKeyException'而终止应用程序,原因:'[< __ NSCFString 0x175949e0> valueForUndefinedKey:]:此类不是密钥值的密钥值编码。 **
以下是我的.m文件的一些相关代码段:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
if (tableView == self.searchDisplayController.searchResultsTableView) {
return self.searchResults.count;
} else {
return _Refs.SubReference.count;
}
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
SubRefCell *cell = [self.tableView dequeueReusableCellWithIdentifier:@"TableCell"forIndexPath:indexPath];
if (cell == nil) {
NSLog(@"Error with nil cell");
}
int row=[indexPath row];
if (tableView == self.searchDisplayController.searchResultsTableView) {
cell.subRefLabel.text = self.searchResults[row];
cell.subRefDescLabel.text = _Refs.SubRefDesc[row]; //fix later
} else {
//set all the cells with the Sub Reference names and their descriptions
cell.subRefLabel.text = _Refs.SubReference[row];
cell.subRefDescLabel.text = _Refs.SubRefDesc[row];
}
return cell;
}
#pragma Search Methods
- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope
{
NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"name contains[c] %@", searchText];
//self.searchSubRef = _Refs.SubReference;
NSLog(@"Here is a list of refs %@",_Refs.SubReference);
//crashes right after this line
self.searchResults = [_Refs.SubReference filteredArrayUsingPredicate:resultPredicate];
NSLog(@"Test");
}
-(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
{
[self filterContentForSearchText:searchString
scope:[[self.searchDisplayController.searchBar scopeButtonTitles]
objectAtIndex:[self.searchDisplayController.searchBar
selectedScopeButtonIndex]]];
return YES;
}
我有自定义单元格并检查'!'在我的tableview控制器和我的表视图单元的所有插座上,但它们似乎都没问题。我还尝试打开故事板作为源代码,并寻找名为“名称”但没有运气的插座。
当我尝试在搜索栏中输入内容时,任何想法会出现问题以及为什么应用程序会崩溃?
答案 0 :(得分:0)
问题似乎是缺少UITableViewCell初始化语句。您正在将tableview单元格出列,而不是首先创建它。
如果dequeue返回nil,则需要以下语句
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"TableCell"];
}
如果dequeueReusableCellWithIithntifier返回nil,在哪里创建一个?
除了使用不同的初始化变体之外,您需要在调用以下方法之前使用registerNib:forCellReuseIdentifier:或registerClass:forCellReuseIdentifier:方法注册类或nib文件,
[tableView dequeueReusableCellWithIdentifier:@"TableCell" forIndexPath:indexPath]
在viewDidLoad中注册nib,如下所示
UINib *cellNib = [UINib nibWithNibName:@"SubRefCell" bundle:nil];
[myTable registerNib:cellNib forCellReuseIdentifier:@"TableCell"];
答案 1 :(得分:0)
我发现问题出在我的NSPredicate上。
NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"name contains[c] %@", searchText];
它正在尝试寻找一个名为name
的可重用单元标识符,我从未声明过它。因此,对此的一个简单修复是使用SELF
代替。
NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"SELF contains[c] %@", searchText];