UIsearch栏不会将数据返回到表

时间:2012-06-29 07:20:45

标签: ios xcode tableview uisearchbar

已编辑的代码

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

再次感谢你的时间。

6 个答案:

答案 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];

原因是因为你还没有使用出列的单元格。