0

编辑代码

 - (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 ^^

再次感谢您的时间。

4

6 回答 6

1

我假设您使用的是原型单元?我刚刚在我的一个项目中遇到了类似的问题。

当搜索结果被显示并被tableView:cellForRowAtIndexPath:调用时,表视图传递给属于搜索结果控制器的表,而不是你的主表视图。问题在于,搜索结果表格视图对表格的原型单元格一无所知,因此dequeueReusableCellWithIdentifier:返回 nil。但是仅仅分配/初始化一个 UITableCellView 不会给你一个原型单元,所以你在情节提要中布置的任何 UI 都不存在。

修复很简单:在tableView:cellForRowAtIndexPath:,不要调用dequeueReusableCellWithIdentifier:传入的tableview;只需在您的主表视图上调用它。所以基本上,只需改变这个:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell==nil) 
    cell=[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];

对此:

UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];

不需要 nil 检查;Apple 的Storyboards 发行说明说:

dequeueReusableCellWithIdentifier: 方法保证返回一个单元格(前提是您已经定义了一个具有给定标识符的单元格)。因此,不需要像之前典型的 tableView:cellForRowAtIndexPath: 实现那样使用“检查方法的返回值”模式。

于 2012-06-29T08:43:19.270 回答
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];
        }
       }
     }
   }
于 2012-06-29T08:37:32.797 回答
0

如果(nameRange.location ==0),您的应用会点击此代码吗?

于 2012-06-29T08:50:58.470 回答
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];
}
于 2012-06-29T09:10:01.953 回答
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

等待直到完成:否]; } }

于 2012-07-02T09:13:30.100 回答
0

你可能想更换

UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];

cell=[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
                            reuseIdentifier:CellIdentifier];

在你的 cellForRowAtIndexPath 中

UITableViewCell *cell=[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
                            reuseIdentifier:CellIdentifier];

原因是您无论如何都没有使用出队的单元格。

于 2013-03-20T13:13:00.080 回答