1

xcode 5 を使用しており、tableView データを検索したいと考えています。「検索」には「Search Bar & Search Display Controller」、「tableCell」には「CustomCell」を使用し、すべてのデータは 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」でフラグなどを使用して2つの配列を使用したくありません。知っている人がいれば、ここで共有してください。高度に感謝します。

4

4 に答える 4

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 に答える
2

文字列を displayItems に追加する代わりに、国に関する情報を含むオブジェクトを追加します。

[displayItems addObject:文字列];

ここでは、countryName のみを displayItems に追加していますが、cellForRowAtIndexPath を呼び出しているときに、検索後にテーブルをリロードするときに、配列 (displayItems) に存在しない大陸、国名、および首都を求めています。

于 2013-10-07T11:16:38.927 に答える
1

クラッシュしたときに正確にどのエラーが発生しましたか?

displayItems配列にオブジェクトを追加するときのようです。国オブジェクトではなく、文字列オブジェクトを追加するだけです。

あなたcurrentCountrycountryただのオブジェクトではありませんstring

したがって、コードに次のように入力します。

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

解析しようとすると、到達できません:

大陸

国の名前

資本

詳細オブジェクトを検索するときは注意してください。

于 2013-10-07T11:52:33.290 に答える