1

我拼凑了几个教程来创建一个带有部分的分组表,我现在正试图让一个 uisearchbar 工作。我遇到的问题是如何在分组部分中搜索。

我已经阅读了这篇文章建议的类似问题,但不能

这是创建分组部分的代码

#import "Job.h"      // A model for the data
#import "Address.h"  // Another model for the data

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.theTable.delegate = self;
    self.theTable.dataSource =self;

    _searchBar.delegate = (id)self;

    FMDBDataAccess *db = [[FMDBDataAccess alloc] init];

    jobs = [[NSMutableArray alloc] init];
    jobs = [db getJobs:1];

    _sections = [[NSMutableDictionary alloc] init];

    NSMutableArray *jobsTempArray = [db getJobsAsDictionary:1];

    BOOL found;

    // Loop through the books and create our keys
    for (NSDictionary *book in jobsTempArray)
    {
        NSString *cLong = [book objectForKey:@"addrAddress"];

        NSString *c = [cLong substringToIndex:1];

        found = NO;

        for (NSString *str in [_sections allKeys])
        {
            if ([str isEqualToString:c])
            {
                found = YES;
            }
        }

        if (!found)
        {
            [_sections setValue:[[NSMutableArray alloc] init] forKey:c];
        }

    }

    // Loop again and sort the books into their respective keys
    for (NSDictionary *book in jobsTempArray)
    {
        [[_sections objectForKey:[[book objectForKey:@"addrAddress"] substringToIndex:1]] addObject:book];
    }

    // Sort each section array
    for (NSString *key in [_sections allKeys])
    {
        [[_sections objectForKey:key] sortUsingDescriptors:[NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"addrAddress" ascending:YES]]];
    }

}

这是搜索的代码

-(void)searchBar:(UISearchBar*)searchBar textDidChange:(NSString*)text
{
    if(text.length == 0)
    {
        _isFiltered = FALSE;
    }
    else
    {
        _isFiltered = true;
        _filteredjobs = [[NSMutableArray alloc] init];

        //for (Job* book in jobs)
        //for (Job* book in [_sections allKeys])
        //for (NSString *food in [_sections allKeys])
        for (NSDictionary* book in [_sections allKeys])
        {
            NSString *addrStr = [book objectForKey:@"addrAddress"];
            NSString *postStr = [book objectForKey:@"addrPostcode"];

            //NSRange nameRange = [book.jobAddress rangeOfString:text options:NSCaseInsensitiveSearch];
            NSRange nameRange = [addrStr rangeOfString:text options:NSCaseInsensitiveSearch];

            //NSRange descriptionRange = [book.jobPostcode rangeOfString:text options:NSCaseInsensitiveSearch];
            NSRange descriptionRange = [postStr rangeOfString:text options:NSCaseInsensitiveSearch];

            if(nameRange.location != NSNotFound || descriptionRange.location != NSNotFound)
            {
                [_filteredjobs addObject:book];
            }
        }
    }

    [self.theTable reloadData];
}

我已经意识到我需要更改for (Job* food in jobs)为,for (NSDictionary* book in [_sections allKeys])但我被困在如何在 [_sections allKeys] 中搜索

特别是这一行

NSRange nameRange = [addrStr rangeOfString:text options:NSCaseInsensitiveSearch];

-[__NSCFString objectForKey:]:无法识别的选择器发送到实例 0x692e200

*** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[__NSCFString objectForKey:]:无法识别的选择器发送到实例 0x692e200”:

有任何想法吗?PS把我当作菜鸟,我需要一些代码和解释——我还在学习obj-c

4

2 回答 2

0

检查链接。它显示了带有分组部分 Tableview 的 UISearchBar。它是一个简单的教程。希望它对你有用

于 2013-03-13T09:06:24.137 回答
0

我在 UISearchBar 中找到了答案 - 搜索对象数组的 NSDictionary并阅读所有键。

基本上循环遍历分组的 NSDictionary 并提取 NSArrays,然后再次循环搜索...

-(void)searchBar:(UISearchBar*)searchBar textDidChange:(NSString*)text
{
    if(text.length == 0)
    {
        _isFiltered = FALSE;
    }
    else
    {
        _isFiltered = true;
        _filteredjobs = [[NSMutableArray alloc] init];

        NSString *currentLetter = [[NSString alloc] init];

        for (int i=0; i<[_sections count]; i++)
        {
            currentLetter = [[_sections allKeys] objectAtIndex:i];

            NSArray *jobsForKey = [ [NSArray alloc] initWithArray:[_sections objectForKey:[[_sections allKeys] objectAtIndex:i]] ];

            for (int j=0; j<[jobsForKey count]; j++)
            {
                NSDictionary *book = [jobsForKey objectAtIndex:j];
                NSRange titleResultsRange = [[book objectForKey:@"addrAddress"] rangeOfString:text options:NSCaseInsensitiveSearch];

                if(titleResultsRange.location != NSNotFound)
                {
                    [_filteredjobs addObject:book];
                }
            }
        }

    }

    [self.theTable reloadData];
}
于 2013-03-13T21:30:53.293 回答