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

あなたの時間のためにもう一度Thx。

4

6 に答える 6

1

プロトタイプセルを使用していると思いますか?私のプロジェクトの1つで同様の問題が発生しました。

検索結果が表示されてtableView:cellForRowAtIndexPath:呼び出されると、メインのテーブル ビューではなく、検索結果コントローラーに属するテーブルにテーブル ビューが渡されます。問題は、検索結果テーブル ビューがテーブルのプロトタイプ セルについて何も知らないため、dequeueReusableCellWithIdentifier:nil を返すことです。しかし、UITableCellView を割り当て/初期化するだけでは、プロトタイプ セルの 1 つが得られないため、ストーリーボードに配置した UI はそこにはありません。

修正は簡単です。 では、渡されたテーブルビューをtableView:cellForRowAtIndexPath:呼び出さないでください。dequeueReusableCellWithIdentifier:メインテーブルビューで呼び出すだけです。基本的に、これを変更するだけです:

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

ついに修正しました。これが私の作業コードです、thx you all =)

- (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]; }}

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

あなたのアプリはこのコード if(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

これを使って:

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