在tableView Cell问题中搜索

时间:2013-10-07 10:54:55

标签: ios objective-c uitableview uisearchdisplaycontroller

我正在使用xcode 5并想要搜索tableView数据。我使用“搜索栏和搜索显示控制器”进行“搜索”,使用“CustomCell”进行“tableCell”,所有数据都通过NSXMLParsing从远程服务器进行解析。所有数据都显示其相应的图像没有任何问题,但有些我的搜索选项无法正常工作。我为单个阵列搜索做了相同的代码,它正在工作。但这不是。在搜索时它崩溃了。这是我的代码:

-(void)loadData
{
    countryParser = [[CountryParser alloc] loadXMLByURL:@"http://www.avowstudio.com/iOS/PartProject/iOS7/XMLParsingWithCustomeCell/XMLFiles/XMLParsingWithCustomCell.xml"];

    countryArray = [countryParser countryArray];

    displayItems = [[NSMutableArray alloc] initWithArray:countryArray];

    [self.countryTableView reloadData];
    [activityIndicator stopAnimating];
    [self loadArray];
}



-(void) loadArray
{
    CountryInfo *currentCountryOne = [[CountryInfo alloc] init];
    totalArray = [[NSMutableArray alloc] init];

    for (int i=0; i < [countryArray count]; i++)
    {
        currentCountryOne = [countryArray objectAtIndex:i];
        [totalArray addObject:currentCountryOne.countryName];
    }
}


-(void) searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
    if ([searchText length] == 0)
    {
        [displayItems removeAllObjects];
        [displayItems addObjectsFromArray:countryArray];
    }
    else
    {
        [displayItems removeAllObjects];
        displayItems = [[NSMutableArray alloc] init];

        for (NSString *string in totalArray)
        {
            NSRange stringRang = [string rangeOfString:searchText options:NSCaseInsensitiveSearch];
            if (stringRang.location != NSNotFound)
            {
                [displayItems addObject:string];
            }
        }
    }
    [self.countryTableView reloadData];
}



- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [displayItems count];
}

// This method is kept the "tableRow height" after "done searching"
- (void)searchDisplayController:(UISearchDisplayController *)controller didLoadSearchResultsTableView:(UITableView *)tableView
{
    tableView.rowHeight = 100;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";

    CountryCustomCell *Cell = [self.countryTableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (!Cell)
    {
        Cell = [[CountryCustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    currentCountry = [displayItems objectAtIndex:indexPath.row];

    Cell.ContinentLabel.text = currentCountry.continent;
    Cell.CountryNameLabel.text = currentCountry.countryName;
    Cell.CapitalLabel.text = currentCountry.capital;

    imageQueueCountryFlag = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);
dispatch_async(imageQueueCountryFlag, ^
    {
        UIImage *imageCountryFlag = [UIImage imageWithData:[NSData dataWithContentsOfURL: [NSURL URLWithString:[currentCountry countryFlag]]]];
    dispatch_async(dispatch_get_main_queue(), ^
        {
            Cell.CountryFlagImageView.image = imageCountryFlag;
            [Cell setNeedsLayout];
        });
    });

return Cell;

}

我不想在“numberOfRowsInSection”中使用两个数组&amp; “cellForRowAtIndexPath”带有标志或类似的东西,以避免更多编码。如果有人熟悉它,请在此分享。非常感谢先进。

4 个答案:

答案 0 :(得分:2)

不是向displayItems添加字符串,而是添加包含有关country的信息的对象。

[displayItems addObject:string];

在这里,你只是将countryName添加到displayItems,但是在调用cellForRowAtIndexPath时:你要求在搜索后重新加载表时,它的大陆,国家名称和资本在数组(displayItems)中不存在。

答案 1 :(得分:2)

我认为您在 [countryParser countryArray] 中添加了 CountryInfo 的对象。在 loadArray 方法中,只需初始化空白对象 currentCountryOne ,每次执行for循环时,尝试将空白对象的属性添加到totalArray中。请进行如下更改:

-(void) loadArray
{
    totalArray = countryArray;
}


-(void) searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
    if ([searchText length] == 0)
    {
        [displayItems removeAllObjects];
        [displayItems addObjectsFromArray:countryArray];
    }
    else
    {
        [displayItems removeAllObjects];
        displayItems = [[NSMutableArray alloc] init];

        for (CountryInfo *country in totalArray)
        {
            NSRange stringRang = [country.countryName rangeOfString:searchText options:NSCaseInsensitiveSearch];
            if (stringRang.location != NSNotFound)
            {
                [displayItems addObject:country];
            }
        }
    }
    [self.countryTableView reloadData];
}

答案 2 :(得分:1)

崩溃时你得到了什么错误?

当您向displayItems数组添加对象时,似乎是这样。您只需添加字符串对象,而不是国家/地区对象。

您的currentCountry不是country对象而只是string

因此,在您的代码中输入:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

当您尝试解析时,无法访问:

  

大陆

     

国家名称

     

资本

搜索详细对象时要小心。

答案 3 :(得分:0)

当你搜索时,你添加字符串来显示项目而不是CountryInfo对象,所以当再次调用cellforrow atindexpath时它必须崩溃