2009-05-13 8 views
0

J'affiche un UITableView, et de temps en temps, la première ligne apparaît au bas de la vue.Décalage lors de l'affichage d'un UITableView

Il n'y a rien au-dessus de la première rangée, et l'espace vide n'est pas touchable.

Jusqu'à présent, j'ai vérifié:

  • headerView de tableView: est vide
  • utilisation UITableViewCells plaine
  • vérifier la rowHeight des cellules
  • vérifier le cadre des cellules
  • lorsque le bogue se produit, il n'y a pas d'avertissement de la mémoire avant
  • vérifiez le contenu de l'ensemble de la table défilement

Ce bug apparaît uniquement sur l'iPhone, jamais sur le simulateur.

La capture d'écran montre à gauche la bonne tableview, et à droite la vue avec le bug. En faisant l'instantané, j'ai touché l'écran pour que la barre de défilement soit visible.

Une idée dans quelle direction je devrais regarder?

Je viens de voir le contenu de la tableViewView scrollView est faux: J'ai 84 cellules @ 67 pixels et 1 cellule @ 57 pixels de hauteur: le total devrait être 5685 mais est 6005. (Off de 320). Étrange.

Stephan

alt text http://www.quicksnapper.com/files/5161/18374733084A0B3EA24D152.png

+0

Vous avez vérifié tout ce que j'aurais vérifié, et il n'apparaît pas que vous utilisez des sections.Je vérifierais à nouveau les sections et si vous sous-classez UITableViewCell, je vérifierais à nouveau ce code. – Jordan

Répondre

0

I Alors trouvé la solution à mon problème:

Ajout d'un NSLog (@ ""). C'est bizarre.

Dans mon viewWillAppear, j'ai

if (searchByCuisinier || searchByResto) { 
    NSLog(@"Will set tableHeaderView"); 
    self.tableView.tableHeaderView = searchBar; 
    if (searchByCuisinier) { 
     searchBar.placeholder = @"Cuisinier"; 
    } else { 
     searchBar.placeholder = @"Restaurant"; 
    } 
    searchBar.autocapitalizationType = UITextAutocapitalizationTypeNone; 
    searchBar.autocorrectionType = UITextAutocorrectionTypeNo; 
    if ([filteredList count] == 0) 
     [searchBar becomeFirstResponder]; 
    } else { 
    self.tableView.tableHeaderView = nil; 
    NSLog(@""); // Magic! 
    } 

Ajout du NSLog (@ "") résout le bogue.

inverser également le test: Au lieu de

if (searchByCuisinier || searchByResto) { 
.... 

je:

if (!searchByCuisinier && !searchByResto) { 
.... 

Je ne sais absolument pas pourquoi cela fonctionne (ou pourquoi cela ne fonctionne pas sans NSLog).

1

Vous pouvez remplacer la méthode touchesBegan du UITableView puis exécutez un test de recherche.

Ensuite, demandez à la vue retourné de quelle classe il s'agit.

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ 

CGPoint location = [[touches anyObject] locationInView:self]; 

UIView *whatIsThis = [self hitTest:locationInView withEvent:event]; 

NSLog([[whatIsThis class] description]); 


} 

Au moins vous aurez un point de départ. Vous pouvez également demander qui est son superView.

+0

C'est un UITableView, et son aperçu est View. –

+0

Maintenant, vous savez que ce n'est pas une cellule et ce n'est pas l'en-tête de la table ou l'en-tête de la section. Je ne suis pas sûr que ce soit les réponses que vous vouliez, mais cela pourrait vous permettre de retrouver le bug –