Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/96.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 搜索NSDictionary的NSArray(包含NSDictionary的NSArray,重复)_Ios_Search_Tree_Nsarray_Nsdictionary - Fatal编程技术网

Ios 搜索NSDictionary的NSArray(包含NSDictionary的NSArray,重复)

Ios 搜索NSDictionary的NSArray(包含NSDictionary的NSArray,重复),ios,search,tree,nsarray,nsdictionary,Ios,Search,Tree,Nsarray,Nsdictionary,我有一个数据结构(在plist中),看起来像这样: 我这里有一个nsdirectory的NSArray。每个NSDictionary有两个键: Title Link (recursive) 这形成了一个树状结构,具有可变长度的分支,即一些分支可以在级别0处消亡,而一些分支可以大到级别3或更高 我将在UITableView中显示此结构(在UINavigationController的帮助下)。这很容易 注意:单击叶节点时 (由NSDictionary对象表示) 使用Nil或Zero作为“链接”

我有一个数据结构(在plist中),看起来像这样:

我这里有一个
nsdirectory
NSArray
。每个
NSDictionary
有两个键:

Title
Link (recursive)
这形成了一个树状结构,具有可变长度的分支,即一些分支可以在级别0处消亡,而一些分支可以大到级别3或更高

我将在
UITableView
中显示此结构(在
UINavigationController
的帮助下)。这很容易

注意:单击叶节点时 (由
NSDictionary
对象表示) 使用Nil或Zero作为“链接”),则 触发事件,即模型窗口 显示一些信息

现在,我需要添加搜索支持

搜索栏将出现在
UITableView
上方(对于0级)。我需要找到一种方法来搜索这个树状结构,然后使用
UISearchDisplayController
显示结果,然后允许用户导航结果

怎么做?。。。这是我有点困的地方 需要一些建议

搜索必须快速,因为我们希望在您键入时进行搜索

p、 我曾想过将这个数据结构转换成CoreData,但它仍然潜伏在我的脑海中。如果您认为它在这种情况下有帮助,请提供建议


编辑: 这是我目前的解决方案,它正在发挥作用(顺便说一句):

核心数据将能够非常高效地在数据存储中执行搜索,并将搜索扩展到更高效的级别。此外,如果您使用TableView,几乎可以肯定它的内存效率会更高—最坏的情况是在任何给定时间只加载一个级别数组。最好的情况要好得多,因为数组中只有几个对象。HTH

核心数据将能够非常高效地在数据存储中执行搜索,并将搜索扩展到更高效的级别。此外,如果您使用TableView,几乎可以肯定它的内存效率会更高—最坏的情况是在任何给定时间只加载一个级别数组。最好的情况要好得多,因为数组中只有几个对象。嗯

#pragma mark -
#pragma mark UISearchDisplayController methods 

- (void)searchBarResultsListButtonClicked:(UISearchBar *)searchBar {
    NSLog(@"%s", __FUNCTION__);
}

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString {
    NSLog(@"%s", __FUNCTION__);
    [self filterCategoriesForSearchText:searchString
                               scope:[controller.searchBar selectedScopeButtonIndex]];

    // Return YES to cause the search result table view to be reloaded.
    return YES;
}

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchScope:(NSInteger)searchOption {
    NSLog(@"%s", __FUNCTION__);
    [self filterCategoriesForSearchText:[controller.searchBar text]
                               scope:[controller.searchBar selectedScopeButtonIndex]];

    // Return YES to cause the search result table view to be reloaded.
    return YES;
}

#pragma mark UISearchDisplayController helper methods

- (void)filterCategoriesForSearchText:(NSString *)searchText scope:(NSInteger)scope {
    self.filteredCategories = [self filterCategoriesInArray:_categories forSearchText:searchText];

    NSSortDescriptor *descriptor = [[[NSSortDescriptor alloc] initWithKey:KEY_DICTIONARY_TITLE ascending:YES] autorelease];
    [self.filteredCategories sortUsingDescriptors:[NSArray arrayWithObjects:descriptor, nil]];
}

- (NSMutableArray *)filterCategoriesInArray:(NSArray *)array forSearchText:(NSString *)searchText {
    NSMutableArray *resultArray = [NSMutableArray array];
    NSArray *filteredResults = nil;

    // Apply filter to array
    // For some weird reason this is not working. Any guesses? [NSPredicate predicateWithFormat:@"%@ CONTAINS[cd] %@", KEY_DICTIONARY_TITLE, searchText];
    NSPredicate *filter = [NSPredicate predicateWithFormat:@"Title CONTAINS[cd] %@", searchText];
    filteredResults = [array filteredArrayUsingPredicate:filter];

    // Store the filtered results (1)
    if ((filteredResults != nil) && ([filteredResults count] > 0)) {
        [resultArray addObjectsFromArray:filteredResults];
    }

    // Loop on related records to find the matching results
    for (NSDictionary *dictionayObject in array) {
        NSArray *innerCategories = [dictionayObject objectForKey:KEY_DICTIONARY_LINK];

        if ((innerCategories != nil) && ([innerCategories count] > 0)) {
            filteredResults = [self filterCategoriesInArray:innerCategories forSearchText:searchText];

            // Store the filtered results (2)
            if ((filteredResults != nil) && ([filteredResults count] > 0)) {
                [resultArray addObjectsFromArray:filteredResults];
            }
        }
    }

    return resultArray;
}