已编辑的代码
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell==nil)
cell=[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
if (isFiltered) {
int rowCount=indexPath.row;
Aves *filtrada=[filteredTableData objectAtIndex:rowCount];
cell.textLabel.text=filtrada.name;
NSLog(@"mostrando: ");
}else {
int rowCounter=indexPath.row;
Aves *author=[theauthors objectAtIndex:rowCounter];
cell.textLabel.text=author.name;
}
NSLog(@"mostrando: ");
return cell;
}
-(void)searchBar:(UISearchBar*)searchBar textDidChange:(NSString*)text
{
if(text.length == 0)
{
isFiltered = FALSE;
}
else
{
isFiltered = true;
int i;
[filteredTableData removeAllObjects];
for(i=0;[theauthors count]>i;i++)
{
Aves *name=[theauthors objectAtIndex:i];
//NSLog(name.name);
NSRange nameRange = [[name.name lowercaseString] rangeOfString:[text lowercaseString]];
if(nameRange.length>0)
{
[filteredTableData addObject:name];
NSLog(name.name);
}
}
[self.tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];
}
}
编辑:经过一段时间我解决了一些问题。刚更新我的代码,问题是重新绘制tableView,其他一切都没问题。检查一下,并给出你有任何想法plz ^^
再次感谢你的时间。
答案 0 :(得分:1)
我假设你正在使用原型细胞?我在其中一个项目中遇到了类似的问题。
当显示搜索结果并调用tableView:cellForRowAtIndexPath:
时,表视图在属于搜索结果控制器的表中传递,而不是主表视图。问题是,搜索结果表视图对表的原型单元格一无所知,因此dequeueReusableCellWithIdentifier:
返回nil。但是只是分配/初始化UITableCellView不会给你一个原型单元格,所以你在故事板中布置的UI都不存在。
修复很简单:在tableView:cellForRowAtIndexPath:
中,不要在传入的tableview上调用dequeueReusableCellWithIdentifier:
;只需在主表视图中调用它即可。所以基本上,只需改变这一点:
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell==nil)
cell=[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
到此:
UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];
没有必要进行零检查; Apple的Storyboards Release Notes说:
保证dequeueReusableCellWithIdentifier:方法返回 一个单元格(前提是您已使用给定的单元格定义了一个单元格 标识符)。因此,无需使用“检查返回值” 方法“模式与以往典型的情况一样 tableView的实现:cellForRowAtIndexPath:。
答案 1 :(得分:0)
使用它:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
//If the requesting table view is the search display controller's table view, return the count of the filtered list, otherwise return the count of the main list.
if (isFiltered)
{
return [filteredTableData count];
}
else
{
return [theauthors count];
}
}
替换方法:
-(void)searchBar:(UISearchBar*)searchBar textDidChange:(NSString*)text
{
if(text.length == 0)
{
isFiltered = FALSE;
}
else
{
isFiltered = true;
int i=0;
[filteredTableData removeAllObjects];
filteredTableData = [[NSMutableArray alloc] init];
//for (Aves* name in theauthors)
for(i=0;[theauthors count]>i;i++)
{
Aves *name=[theauthors objectAtIndex:i];
NSRange nameRange = [[name.foodName lowercaseString] rangeOfString:[text lowercaseString]];
if(nameRange.length>0)
{
[filteredTableData addObject:name];
[self.tableView reloadData];
}
}
}
}
答案 2 :(得分:0)
如果(nameRange.location == 0)你的应用程序是否会遇到此代码?
答案 3 :(得分:0)
更改
的代码段else
{
isFiltered = true;
int i=0;
[filteredTableData removeAllObjects];
filteredTableData = [[NSMutableArray alloc] init];
//for (Aves* name in theauthors)
for(i=0;[theauthors count]>i;i++)
{
Aves *name=[theauthors objectAtIndex:i];
NSRange nameRange = [name.foodName rangeOfString:text ];
if(nameRange.location ==0)
{
[filteredTableData addObject:name];
}
[self.tableView reloadData];
}
}
到
else
{
isFiltered = true;
int i=0;
[filteredTableData removeAllObjects];
//filteredTableData = [[NSMutableArray alloc] init]; not needed
//for (Aves* name in theauthors)
for(i=0;[theauthors count]>i;i++)
{
Aves *name=[theauthors objectAtIndex:i];
NSRange nameRange = [name.foodName rangeOfString:text ];
if(nameRange.location != NSNotFound)
{
[filteredTableData addObject:name];
}
}
[self.tableView reloadData];
}
答案 4 :(得分:0)
终于修好了。这是我的工作代码,大家是=)
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];
cell=[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:CellIdentifier];
if (isFiltered==TRUE) {
int rowCount=indexPath.row;
//for (rowCount=0; rowCount<[filteredTableData count]; rowCount++) {
Aves *filtrada=[filteredTableData objectAtIndex:rowCount];
cell.textLabel.text=filtrada.name;
//}
}else if(isFiltered==FALSE)
{
int rowCounter=indexPath.row;
Aves *author=[theauthors objectAtIndex:rowCounter];
cell.textLabel.text=author.name;
}
return cell;
}
- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)text {
[filteredTableData removeAllObjects]; filteredTableData=[[NSMutableArray alloc]init ]; if(text.length == 0) { isFiltered = FALSE; } else { isFiltered = TRUE; int i; for(i=0;[theauthors count]>i;i++) { Aves * filtrado=[[Aves alloc]init]; filtrado=[theauthors objectAtIndex:i]; //NSLog(filtrado.name); NSRange nameRange = [[filtrado.name lowercaseString] rangeOfString:[text lowercaseString]]; if(nameRange.length>0) { [filteredTableData addObject:filtrado]; } } [self.tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil
waitUntilDone:NO]; } }
答案 5 :(得分:0)
您可能想要替换
UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];
cell=[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:CellIdentifier];
在你的cellForRowAtIndexPath
中UITableViewCell *cell=[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:CellIdentifier];
原因是因为你还没有使用出列的单元格。