UITableView envoie uniquement des données à Detail View Controller à la deuxième tentative

Hé là, je travaille sur une application de transport depuis un certain time et je suis coincé avec ce problème depuis un moment maintenant.

J'utilise iOS 5 et un storyboard. Fondamentalement, j'ai un UITableView qui affiche les locations d'arrêt de bus favoris, lorsqu'un user sélectionne une ligne que j'utilise:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { Favorite *favorite = [self.favoriteItems objectAtIndex:indexPath.row]; stopSsortingng = favorite.title; routeSsortingng = favorite.subtitle; } 

Avec les informations d'arrêt et d'itinéraire de la cellule, l'user a choisi Je prépare une séquence qui correspond à une séquence sur mon storyboard, en poussant un controller de vue de détail qui utilise le nom de l'arrêt et le nom de la route.

Je suis assez novice en Objective C et en iOS, donc j'utilise une section que mon ami m'a dit fonctionnerait, cependant, ça pourrait être le problème. La segue ressemble à ceci:

 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { UIViewController *destination = segue.destinationViewController; if ([destination respondsToSelector:@selector(setDelegate:)]) { [destination setValue:self forKey:@"delegate"]; } if ([destination respondsToSelector:@selector(setSelection:)]) { NSSsortingng *route = routeSsortingng; NSDictionary *selection1 = [NSDictionary dictionaryWithObjectsAndKeys:route, @"route", stopSsortingng, @"stop", nil]; [destination setValue:selection1 forKey:@"selection"]; } } 

Après le segue dans mon DetailViewController je prends les informations d'arrêt et d'itinéraire dans la vue DidLoad:

 - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. route = [selection objectForKey:@"route"]; stopName = [selection objectForKey:@"stop"]; NSLog(@"stopName: %@", stopName); NSLog(@"routeName: %@", route); } 

Voici où mes problèmes se posent. Quand je lance le simulateur et que je clique sur une cellule dans ma vue de table, je suis poussé vers le DVC, cependant, stopName et routeName sont tous les deux null, donc aucune information n'a été envoyée ou reçue. MAIS, si je returnne à la table et que je clique sur une autre cellule, les champs routeName et stopName sont remplis avec les informations qui auraient dû être envoyées la première fois que j'ai cliqué sur une cellule. Si je continue ce process, il continue à envoyer les informations pour la cellule tapée précédemment, pas actuellement.

Donc, fondamentalement, les informations sont envoyées, mais seulement après avoir traversé la section deux fois. Évidemment, je veux qu'il envoie l'information et la reçoive la première fois, mais il est retardé et me rend fou. J'apprécie n'importe quelle aide que quelqu'un peut me donner comme j'ai cherché l'Internet pendant des jours maintenant essayant de résoudre ce problème, merci tellement d'avance pour n'importe quelle aide!

prepareForSegue: est appelé avant didSelectRowAtIndexPath: C'est pourquoi les valeurs que vous voyez sont toujours à la traîne.

La meilleure solution est d'get les valeurs stopSsortingng et routeSsortingng dans votre méthode prepareForSegue: (et non pas didSelectRowForIndexPath: du tout). La key pour faire cela est de réaliser que la valeur du paramètre sender passée à prepareForSegue: est UITableViewCell qui a été tapée. Vous pouvez utiliser la méthode indexPathForCell pour get indexPathForCell de la cellule dans votre table, puis l'utiliser pour searchr datatables dans votre tableau favoriteItems .

 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { UITableViewCell *cell = (UITableViewCell*)sender; NSIndexPath *indexPath = [self.tableView indexPathForCell:cell]; Favorite *favorite = [self.favoriteItems objectAtIndex:indexPath.row]; stopSsortingng = favorite.title; routeSsortingng = favorite.subtitle; UIViewController *destination = segue.destinationViewController; if ([destination respondsToSelector:@selector(setDelegate:)]) { [destination setValue:self forKey:@"delegate"]; } if ([destination respondsToSelector:@selector(setSelection:)]) { NSSsortingng *route = routeSsortingng; NSDictionary *selection1 = [NSDictionary dictionaryWithObjectsAndKeys:route, @"route", stopSsortingng, @"stop", nil]; [destination setValue:selection1 forKey:@"selection"]; } } 

Assurez-vous que vous ne connectez pas le segue au controller de vue suivant à la tableView CELL directement. Connectez-vous à l'set UITableViewController / UIViewController (selon ce que vous utilisez) et donnez un nom, par exemple "segueNameInStoryboard".

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { Favorite *favorite = [self.favoriteItems objectAtIndex:indexPath.row]; stopSsortingng = favorite.title; routeSsortingng = favorite.subtitle; /* add this line */ [self performSegueWithIdentifier:@"segueNameInStoryboard" sender:self]; } - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if([segue.identifier isEqualToSsortingng:@"segueNameInStoryboard"]) { UIViewController *nextViewController = segue.destinationViewController; nextViewController.delegate = self; NSDictionary *selection1 = [NSDictionary dictionaryWithObjectsAndKeys:routeSsortingng, @"route", stopSsortingng, @"stop", nil]; nextViewController.selection = selection1; } }