Essayer de faire quelque chose que j'ai vu documenté dans beaucoup d'endroits, mais que je n'arrive pas à gérer. J'essaie de transmettre des données d'une vue à une autre lors d'une séquence.
Voici la méthode prepareForSegue dans la vue source:
- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
//pass values
DetailViewController *dest = (DetailViewController *)[segue destinationViewController];
dest.locTitle = [value valueForKeyPath:@"title"];
dest.locInfo = [value valueForKeyPath:@"info"];
// NSLog(@"The title is: %@, and the info is: %@.",dest.locTitle,dest.locInfo);
}
Si j'active ce dernier NSLog
, je vois les valeurs correctes ...
Voici l'interface sur la vue de destination:
#import <UIKit/UIKit.h>
@interface DetailViewController : UIViewController{
}
@property (strong, nonatomic) NSString *locTitle;
@property (strong, nonatomic) NSString *locInfo;
@property (weak, nonatomic) IBOutlet UILabel *detailMainText;
@property (weak, nonatomic) IBOutlet UILabel *detailTitle;
@end
... et voici le viewDidLoad et le @synthesize pertinent sur la vue de destination:
@synthesize detailMainText,detailTitle,locTitle,locInfo;
- (void)viewDidLoad
{
[super viewDidLoad];
NSLog(@"In viewDidLoad - the title is: %@ and the info is: %@",self.locTitle,self.locInfo);
detailTitle.text = locTitle;
detailMainText.text = locInfo;
}
Cette NSLog
rapporte des valeurs de null
pour chacune de ces variables.
J'apprécierais toute aide que vous pourriez me donner. Je suis sûr que je fais quelque chose de stupide et évident.
Merci d'avance pour votre aide.
OK ... Je pense que je le resserre.
J'ai découvert que (contre-intuitivement)
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
est appelé après
- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
Ce qui est déroutant, et a également analysé mon petit schéma pour déterminer quel morceau de ma source de données NSDictionary
devrait être affiché dans ma vue détaillée. Actuellement, je fais ceci:
// send info to detail view according to which row selected
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
//Get the selected object in order to fill out the detail view
myValue = [myLocations objectForKey:[locationsIndex objectAtIndex:indexPath.row]];
}
Mais puisque cela se produit après la séquence, c'est un peu inutile. Comment puis-je accéder au numéro de ligne dans la méthode prepareForSegue?
Merci encore.
Voici la réponse à la question:
Comment accéder à un numéro de ligne sélectionné dans la méthode prepareForSegue?
J'espère que quelqu'un le trouvera utile.
Tout d'abord, configurez un IBOutlet
pour la tableview dans l'interface du contrôleur listView:
@property (weak, nonatomic) IBOutlet UITableView *tableView;
Votre prepareForSegue peut alors faire ceci:
- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([[segue identifier] isEqualToString: @"showDetail"]) {
//pass values
NSLog(@"The sender is %@",sender);
NSIndexPath *indexPath = [self.tableView indexPathForCell:sender];
//Get the selected object in order to fill out the detail view
id myValue = [myLocations objectForKey:[locationsIndex objectAtIndex:indexPath.row]];
DetailViewController *dest = [segue destinationViewController];
dest.locTitle = [myValue valueForKeyPath:@"title"];
dest.locInfo = [myValue valueForKeyPath:@"info"];
//NSLog(@"The title is: %@, and the info is: %@.",dest.locTitle,dest.locInfo);
}
}
vous pouvez y parvenir en faisant ceci: passez d'abord la valeur que vous souhaitez envoyer au contrôleur de destination ici :
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
[self performSegueWithIdentifier:@"segueToLocation" sender:the object you want to pass];
}
puis récupérez l'objet ici
- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([[segue identifier] isEqualToString: @"segueToLocation"]) {
DetailViewController *dest = (DetailViewController *)[segue destinationViewController];
//the sender is what you pass into the previous method
dest.target=sender
}
}
Vous n'avez pas besoin de créer une variable d'instance locale du contrôleur de vue de destination. Cela fera de même:
[segue.destinationViewController setLocTitle: [myValue valueForKeyPath:@"title"];
[segue.destinationViewController setLocInfo: [myValue valueForKeyPath:@"info"];
Je pense que j'ai eu absolument le même problème, alors j'espère que ma solution vous aidera aussi. Cela devrait répondre à la première partie de votre question, ou au moins aider quelqu'un d'autre.
Tout d'abord, vous ne pouvez pas attribuer de valeurs passées aux propriétés avec la méthode viewDidLoad
dans SecondViewController. Cela donne nil, car viewDidLoad est implémenté avant Segue.
Et je ne recommanderais pas d'utiliser viewDidAppear
, car les valeurs seront modifiées après le chargement de la vue, ce qui rend le processus de changement visuellement visible.
Par conséquent, la meilleure option consiste à attribuer les valeurs directement au IBOutlet's
. Si vous souhaitez passer un tableau de chaînes, vous pouvez attribuer une valeur de tableau que vous souhaitez charger en premier, et également passer tous les NSArray
. Cela permettra à votre vue d'être déjà chargée avec la valeur, et vous aurez également d'autres valeurs avec lesquelles travailler.
Vous pouvez également appeler la méthode et transmettre des données.
Vous pouvez essayer ceci:
[[NSString alloc] initWithFormat:@"%@",
[segue.destinationViewController setLocTitle: [myValue valueForKeyPath:@"title"]];
[[NSString alloc] initWithFormat:@"%@",
[segue.destinationViewController setLocTitle: [myValue valueForKeyPath:@"info"]];
Une autre option - pourrait utiliser la méthode suivante:
qui se déclenche avant prepareForSegue.