UISearchDisplay由于键值而崩溃

时间:2014-08-18 19:58:46

标签: ios objective-c uisearchdisplaycontroller

我有一个工作表视图控制器,它根据与前一个表视图控制器对应的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控制器和我的表视图单元的所有插座上,但它们似乎都没问题。我还尝试打开故事板作为源代码,并寻找名为“名称”但没有运气的插座。

当我尝试在搜索栏中输入内容时,任何想法会出现问题以及为什么应用程序会崩溃?

2 个答案:

答案 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];