1

我正在使用 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”和“cellForRowAtIndexPath”中使用带有标志或类似东西的两个数组,以避免更多的编码。如果有熟悉它的人,请在这里分享。非常感谢先进。

4

4 回答 4

2

不是向 displayItems 添加字符串,而是添加包含有关国家/地区信息的对象。

[显示项目添加对象:字符串];

在这里,您仅将 countryName 添加到 displayItems 中,但在调用 cellForRowAtIndexPath: 时,您在搜索后重新加载表时询问其大陆、国家名称和大写字母,而数组 (displayItems) 中不存在这些信息。

于 2013-10-07T11:16:38.927 回答
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];
}
于 2013-10-07T11:19:29.743 回答
1

当它崩溃时,你究竟得到了哪个错误?

似乎是当您将对象添加到displayItems数组时。您只需添加字符串对象,而不是国家对象。

currentCountry的不仅仅是一个country对象string

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

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

当您尝试解析时,它无法到达:

大陆

国家的名字

首都

搜索详细对象时要小心。

于 2013-10-07T11:52:33.290 回答
0

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

于 2013-10-07T11:02:53.573 回答