UITableView: удаление ячеек - PullRequest
2 голосов
/ 11 марта 2011

Ребята, у меня есть небольшая проблема здесь. Я делаю поиск в моем UITableView. Я ищу "iPhone", он возвращает мне один результат. Все нормально. У iPhone только один результат. Но когда я ищу iPad, у которого есть два результата, он дает мне 2 результата, но в первой строке все еще отображается информация об iphone. Второе отображение на iPad правильной информации.

Когда я снова нажимаю на строку поиска, чтобы найти другое слово, я получаю две нужные строки ipad. Но когда я нажимаю кнопку отмены, он возвращается к строкам iPhone и iPad.

Что я делаю не так?

Спасибо

Методы ячейки и таблицы:

        - (NSInteger)tableView:(UITableView *)tableView
         numberOfRowsInSection:(NSInteger)section {
            return [self.listCod count];
        }




        - (UITableViewCell *)tableView:(UITableView *)tableView
                 cellForRowAtIndexPath:(NSIndexPath *)indexPath {
            static NSString *MyIdentifier = @"SearchResult";
            UITableViewCell *cell = [tableView
                                     dequeueReusableCellWithIdentifier:MyIdentifier];

            if (cell == nil) {
                cell =
                [[[UITableViewCell alloc]
                  initWithFrame:CGRectMake(0, 0, 180, 200)
                  reuseIdentifier:MyIdentifier]
                 autorelease];


            UIColor *bkgColor = [[UIColor alloc] initWithPatternImage:[UIImage imageNamed:@"SearchViewTableCellBackground.png"]];

            UIView* backgroundView = [ [ [ UIView alloc ] initWithFrame:CGRectZero ] autorelease ];
            backgroundView.backgroundColor = bkgColor;
            cell.backgroundView = backgroundView;

            // Foto do produto

            UIView *teste = [[UIView alloc] init];
            teste.frame = CGRectMake(5, 5, 100, 100);
            teste.backgroundColor = [UIColor blueColor];
            [cell addSubview:teste];


            // Label de Marca

            UILabel *marca = [[UILabel alloc] init];
            marca.frame = CGRectMake(115, 10, 195, 25);
            marca.backgroundColor = [UIColor clearColor];
            marca.textColor = [UIColor grayColor];
            NSString *marcaString = [self.listMarca objectAtIndex:indexPath.row];
            marca.font = [UIFont systemFontOfSize:13.0];
            marca.text = marcaString;
            [cell addSubview:marca];
            [marca release];


            // Label do nome do produto

            UILabel *nome = [[UILabel alloc] init];
            nome.frame = CGRectMake(115, 30, 195, 25);
            nome.backgroundColor = [UIColor clearColor];
            nome.textColor = [[UIColor alloc] initWithRed:26.0 / 255 green:177.0 / 255 blue:240.0 / 255 alpha:1.0];

            nome.font = [UIFont boldSystemFontOfSize:25.0];
                NSString *noemString = [self.listName objectAtIndex:indexPath.row];
                nome.text = noemString;
            [cell addSubview:nome];
            [nome release];

            //Preco

            UILabel *preco = [[UILabel alloc] init];
            preco.frame = CGRectMake(115, 55, 195, 25);
            preco.backgroundColor = [UIColor clearColor];
            preco.textColor = [UIColor grayColor];


            // Manda preco e parcela pra tratar

            [self priceFormat:[self.listPreco objectAtIndex:indexPath.row] :[self.listParcela objectAtIndex:indexPath.row]];


            preco.font = [UIFont boldSystemFontOfSize:20.0];
            preco.text = self.precoFinal;
            [cell addSubview:preco];


            //Parcela

            UILabel *parcelaLabel = [[UILabel alloc] init];
            parcelaLabel.frame = CGRectMake(115, 73, 195, 25);
            parcelaLabel.backgroundColor = [UIColor clearColor];
            parcelaLabel.textColor = [UIColor grayColor];
            parcelaLabel.font = [UIFont systemFontOfSize:13.0];
            parcelaLabel.text = self.parcelamentoFinal;

            [cell addSubview:parcelaLabel];

            }



            return cell;
        }

И методы панели поиска:

            - (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar {
                [searchBar setShowsCancelButton:YES animated:YES];
                self.theTableView.allowsSelection = NO;
                self.theTableView.scrollEnabled = NO;
                [theTableView setRowHeight:110];
            }

            - (void)searchDisplayController:(UISearchDisplayController *)controller
             willShowSearchResultsTableView:(UITableView *)tableView
            {
                [tableView setRowHeight:[[self theTableView] rowHeight]];
                tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
                [self.tableData removeAllObjects];
                [self.theTableView reloadData];
            }

            - (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar {
                searchBar.text=@"";

                [searchBar setShowsCancelButton:NO animated:YES];
                [searchBar resignFirstResponder];
                self.theTableView.allowsSelection = YES;
                self.theTableView.scrollEnabled = YES;
            }


            - (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString {
                return NO;
            }

            - (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar {

                // Converte a String do campo de busca

                NSString* buscaGet =
                [searchBar.text stringByAddingPercentEscapesUsingEncoding:
                 NSASCIIStringEncoding];    


                // Conecta com a URL


                NSString *endereco = [[NSString alloc] initWithFormat:@"http://localhost/icomm/test.php?nome=%@", buscaGet];

                // Lê o resultado

                TBXML * tbxml = [[TBXML tbxmlWithURL:[NSURL URLWithString:endereco]] retain];
                TBXMLElement * rootXMLElement = tbxml.rootXMLElement;


                TBXMLElement * item = [TBXML childElementNamed:@"produto" parentElement:rootXMLElement];

                listCod = [[NSMutableArray alloc] init];

                listMarca = [[NSMutableArray alloc] init];

                listName = [[NSMutableArray alloc] init];

                listPreco = [[NSMutableArray alloc] init];

                listParcela = [[NSMutableArray alloc] init];

                while (item) {


                    // Seta a id do produto

                    TBXMLElement * codigo = [TBXML childElementNamed:@"item" parentElement:item];
                    NSString * codProd = [TBXML textForElement:codigo];

                    [self.listCod addObject:codProd];


                    // Seta a marca do produto

                    TBXMLElement * marca = [TBXML childElementNamed:@"marca" parentElement:item];
                    NSString * marcaProd = [TBXML textForElement:marca];    
                    [self.listMarca addObject:marcaProd];

                    // Seta o nome do produto

                    TBXMLElement * nome = [TBXML childElementNamed:@"nome" parentElement:item];
                    NSString * nomeProd = [TBXML textForElement:nome];
                    [self.listName addObject:nomeProd];


                    // Seta o preco do produto

                    TBXMLElement * preco = [TBXML childElementNamed:@"preco" parentElement:item];
                    NSString * precoProd = [TBXML textForElement:preco];    
                    [self.listPreco addObject:precoProd];



                    // Seta o parcela do produto

                    TBXMLElement * parc = [TBXML childElementNamed:@"parcela" parentElement:item];
                    NSString * parcProd = [TBXML textForElement:parc];
                    [self.listParcela addObject:parcProd];




                    // Procura o proximo produto.

                    item = [TBXML nextSiblingNamed:@"produto" searchFromElement:item
                            ];
                }


                NSLog(@"%@", self.listName);

                [searchBar setShowsCancelButton:NO animated:YES];
                [searchBar resignFirstResponder];
                self.theTableView.allowsSelection = YES;
                self.theTableView.scrollEnabled = YES;

                //Remove tudo da table e recarrega

                [[[self searchDisplayController] searchResultsTableView] performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];

                [tableData removeAllObjects];
                [theTableView reloadData];

            }

Спасибо за все.

1 Ответ

1 голос
/ 11 марта 2011

Вы устанавливаете свои метки только внутри части if (cell == nil) своего кода.Это вызывается только при первом создании ячейки;после этого ячейка снимается с производства для повторного использования, и вы не создаете новую ячейку.Если вы хотите удалить такие ячейки из очереди, вам нужно установить текст (и любое другое свойство метки, которое может измениться) вне оператора if.Для того, чтобы получить ссылки на ваши ярлыки, вам нужно будет использовать теги и viewWithTag:.

. Или, если вы хотите упростить вещи, не снимайте с охраны свои tableCells;хотя это может привести к проблемам с производительностью, если у вас много ячеек.

...