我正在使用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”带有标志或类似的东西,以避免更多编码。如果有人熟悉它,请在此分享。非常感谢先进。
答案 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时它必须崩溃