2011-10-14 4 views
3

j'ai deux tableviews, on a plusieurs cellules Tableview chaque cellule ouvre la même sous-vue mais initalized avec de nouvelles données ..tique accessoire sur UITableViewCell ne montrant pas dans certains cas,

Il y a environ environ 100 - 200 entrées dans la table et j'ai une vue accessoire qui est une coche qui quand une cellule est sélectionnée elle coche la cellule puis charge à nouveau la vue principale. Si je sélectionne cette même cellule pour récupérer le même jeu de données, elle charge la cellule précédemment sélectionnée au milieu de l'écran (donc elle connaît son chemin d'index) mais la coche "en fonction de la profondeur de la liste" ou ne sera pas visible ..

Il a tendance à fonctionner dans environ les 30/40% de la table, mais tout ce qui est inférieur ne sera pas visible ... à moins d'aller de plus en plus profond temps puis parfois je peux obtenir la tique d'apparaître dans la partie la plus profonde de la table. Quelqu'un pourrait-il savoir pourquoi cela se produit?

Quelqu'un a-t-il déjà eu quelque chose de cette nature?

à une enquête plus approfondie, je pense que quelque chose ne va pas dans cette méthode ..

Tout d'abord, dans la sous-vue une fois que l'utilisateur sélectionne une cellule cette méthode est appelée

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

// Navigation logic may go here. Create and push another view controller. 
    [self.navigationController popViewControllerAnimated:YES]; //pops current view from the navigatoin stack 

    //accesses selected cells content 
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; 
    // now you can use cell.textLabel.text 

    //This if statment is based off which cell was selected in the parent view so that it knows which cell to pass the data back to 
    if (parentViewSelectedIndexPath.section == 0) { 
     if (parentViewSelectedIndexPath.row == 0) { 
      manufactureCellTextLabel = cell.textLabel.text; //passing label text over to NSString for use with delegate (check "viewwilldissapear") 
      [[self delegate] setManufactureSearchFields:manufactureCellTextLabel withIndexPath:indexPath]; //This is where I pass the value back to the mainview 
     } 
// a few more If statements for the other methods I can pass data too. 


//--- this if block allows only one cell selection at a time 
    if (oldCheckedData == nil) { // No selection made yet 
     oldCheckedData = indexPath; 
     [cell setAccessoryType:UITableViewCellAccessoryCheckmark]; 

    } 
    else { 
     UITableViewCell *formerSelectedcell = [tableView cellForRowAtIndexPath:oldCheckedData]; // finding the already selected cell 
     [formerSelectedcell setAccessoryType:UITableViewCellAccessoryNone]; 

     [cell setAccessoryType:UITableViewCellAccessoryCheckmark]; // 'select' the new cell 
     oldCheckedData = indexPath; 
    } 
} 

Ce chemin passe Index sur la méthode de la vue principale ...

- (void) setManufactureSearchFields:(NSString *)cellLabeltext withIndexPath:(NSIndexPath *)myIndexPath 
    { 
     manufactureSearchObjectString = cellLabeltext; 
     manufactureResultIndexPath = myIndexPath; 
     [self.tableView reloadData]; //reloads the tabels so you can see the value. 
    } 

// qui définit alors le manufactureResultIndexPath qui est utilisé dans la méthode suivante pour passer revenir à la sous-vue

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    // Navigation logic may go here. Create and push another view controller. 
    //--- Idendify selected indexPath (section/row) 
    if (indexPath.section == 0) { 
     //--- Get the subview ready for use 
     VehicleResultViewController *vehicleResultViewController = [[VehicleResultViewController alloc] initWithNibName:@"VehicleResultViewController" bundle:nil]; 
     // ... 
     //--- Sets the back button for the new view that loads 
     self.navigationItem.backBarButtonItem = [[[UIBarButtonItem alloc] initWithTitle:@"Back" style: UIBarButtonItemStyleBordered target:nil action:nil] autorelease]; 

     // Pass the selected object to the new view controller. 
     [self.navigationController pushViewController:vehicleResultViewController animated:YES]; 

     [vehicleResultViewController setDelegate:self]; 

     if (indexPath.row == 0) 
     { 
      vehicleResultViewController.title = @"Manufacture"; 
      [vehicleResultViewController setRequestString:@"ID.xml"]; //sets the request string in searchResultsViewController 
      vehicleResultViewController.dataSetToParse = @"ID"; // This is used to controll what data is shown on subview... logic 
      [vehicleResultViewController setAccessoryIndexPath:manufactureResultIndexPath]; //sends indexpath back to subview for accessory tick 
      vehicleResultViewController.parentViewSelectedIndexPath = indexPath; 
     } 


//etc etc 
} 

Et finalement je passe à la méthode dans mon sous-vue qui passe le indexPath à oldCheckedData

- (void)setAccessoryIndexPath:(NSIndexPath *)myLastIndexPath 
{ 
       oldCheckedData = myLastIndexPath; 
       [self.tableView reloadData]; //<<---- this is where I reload the table to show the tick... 
} 

Répondre

2

Essayez de déplacer les cell.accessoryType = lignes à la fonction de délégué willDisplayCell: comme ceci:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { 

    // You can move this one here too: 
    cell.selectionStyle = UITableViewCellSelectionStyleNone; // no blue selection 

    if (indexPath == oldCheckedData) { 
     cell.accessoryType = UITableViewCellAccessoryCheckmark; 
    } else { 
     cell.accessoryType = UITableViewCellAccessoryNone; 
    } 
} 

J'ai lu que la méthode willDisplayCell: doit être utilisée pour toutes les modifications visuelles de base d'une cellule comme selectionStyle/accessoryType, et la cellForRowAtIndexPath: méthode pour les opérations liées aux données de la cellule comme le réglage du texte, images, etc ...

+0

okay merci je vais essayer .. parce que j'ai remarqué quand je déboguais que ifstatment il est appelé pour chaque cellule dans la vue actuelle .. semble donc assez inefficace ... Je vous dirai comment je vais. –

+0

@ C.Johns Cool, et si elle est encore brisée pouvez-vous poster le code où vous définissez 'oldCheckedData'. La vérification de 'if' contre' oldCheckedData' pourrait être cassée de quelque chose qui arrive à 'oldCheckedData' pendant le chargement de la table. – chown

+0

okay donc ajouté que dans et ce qu'il fait exactement la même chose que ce qu'il faisait avant .. montrant quelques tiques en haut mais pas en bas bas ... Va poster le code dans l'ordre de comment il est appelé maintenant, merci de m'avoir aidé vous voyez quelque chose que je n'ai pas. –

Questions connexes