passer une valeur entre deux tabs
[font=verdana, geneva, lucida,]Bonjour,[/font]
[font=verdana, geneva, lucida,]J'essai désespérément de faire passer une valeur provenant du 1er onglet d'une tabbar qui scanne un QR-Code vers un 2ème onglet.[/font]
[font=verdana, geneva, lucida,]Je m'explique j'ai deux tabbar ViewControllerScan, qui permet de scanner un QR-Code et reçoit un nombre et ViewControllerData qui doit recevoir ce nombre afin de le placer dans une URL.[/font]
[font=verdana, geneva, lucida,]Il n'y a pas de bouton à part le TabBar qui permet le lien et tout ce que je trouve pour le passage de valeur se fait toujours avec des boutons.[/font]
[font=verdana, geneva, lucida,]Voici mon storyboard: [/font]
ViewControllerScan.m
ViewControllerData.h
ViewControllerData.m
J'espère que quelqu'un peut m'aider... Je suis débutante...
[font=verdana, geneva, lucida,]J'essai désespérément de faire passer une valeur provenant du 1er onglet d'une tabbar qui scanne un QR-Code vers un 2ème onglet.[/font]
[font=verdana, geneva, lucida,]Je m'explique j'ai deux tabbar ViewControllerScan, qui permet de scanner un QR-Code et reçoit un nombre et ViewControllerData qui doit recevoir ce nombre afin de le placer dans une URL.[/font]
[font=verdana, geneva, lucida,]Il n'y a pas de bouton à part le TabBar qui permet le lien et tout ce que je trouve pour le passage de valeur se fait toujours avec des boutons.[/font]
[font=verdana, geneva, lucida,]Voici mon storyboard: [/font]
<br />
#import <UIKit/UIKit.h><br />
#import "ViewControllerData.h"<br />
@interface ViewControllerScan : UIViewController <ZBarReaderDelegate, ViewControllerDataDelegate><br />
@property (nonatomic, retain) IBOutlet UIImageView *resultImage;<br />
@property (nonatomic, retain) IBOutlet UITextView *resultText;<br />
- (IBAction) scanButtonTapped;<br />
@end<br />
ViewControllerScan.m
<br />
#import "ViewControllerScan.h"<br />
@interface ViewControllerScan ()<br />
@end<br />
@implementation ViewControllerScan<br />
@synthesize resultImage, resultText;<br />
<br />
- (IBAction) scanButtonTapped<br />
{<br />
<br />
// ADD: present a barcode reader that scans from the camera feed<br />
ZBarReaderViewController *reader = [ZBarReaderViewController new];<br />
reader.readerDelegate = self;<br />
reader.supportedOrientationsMask = ZBarOrientationMaskAll;<br />
<br />
ZBarImageScanner *scanner = reader.scanner;<br />
// TODO: (optional) additional reader configuration here<br />
<br />
<br />
[scanner setSymbology: ZBAR_QRCODE<br />
config: ZBAR_CFG_X_DENSITY<br />
to: 2];<br />
<br />
[scanner setSymbology:ZBAR_QRCODE<br />
config:ZBAR_CFG_Y_DENSITY<br />
to:2];<br />
<br />
reader.readerView.zoom = 1;<br />
<br />
reader.scanCrop= CGRectMake(0, 0, 1, 1);<br />
<br />
// present and release the controller<br />
[self presentModalViewController: reader<br />
animated: YES];<br />
<br />
NSLog(@"je suis là ");<br />
}<br />
- (void) imagePickerController: (UIImagePickerController*) reader didFinishPickingMediaWithInfo: (NSDictionary*) info<br />
{<br />
<br />
id <NSFastEnumeration> results =<br />
[info objectForKey: ZBarReaderControllerResults];<br />
assert(results);<br />
<br />
UIImage *image = [info objectForKey: UIImagePickerControllerOriginalImage];<br />
assert(image);<br />
if(image)<br />
resultImage.image = image;<br />
<br />
ZBarSymbol *symbol = nil;<br />
for(symbol in results){<br />
resultText.text = symbol.data;<br />
break;<br />
}<br />
<br />
NSString* resultat = resultText.text;<br />
<br />
NSNumber* resultatChiffre = [NSNumber numberWithInt: 1];<br />
NSNumber *tester = [NSNumber numberWithInt: resultat.intValue];<br />
<br />
<br />
NSLog(@"data=%@\n", symbol.data);<br />
NSLog(@"TEXTE = %@", resultText.text);<br />
<br />
NSLog(@"ESSAI = %@", tester);<br />
<br />
NSLog(@"TEST = %d", resultatChiffre.intValue);<br />
<br />
// ADD: dismiss the controller (NB dismiss from the *reader*!)<br />
[reader dismissModalViewControllerAnimated: YES];<br />
<br />
<br />
ViewControllerData *controller = [[ViewControllerData alloc] initWithNibName:@"ViewControllerData" bundle:nil];<br />
// Passage du nombre<br />
[controller setMyNumber:[NSNumber numberWithInt:2]];<br />
<br />
}<br />
ViewControllerData.h
<br />
#import <UIKit/UIKit.h><br />
#import "RestKit/RestKit.h"<br />
@class ViewControllerData;<br />
@protocol ViewControllerDataDelegate<br />
@end<br />
@interface ViewControllerData : UIViewController<UIAlertViewDelegate,UITableViewDelegate, UITableViewDataSource,RKObjectLoaderDelegate><br />
{<br />
UITableView* _tableView;<br />
NSArray* _data;<br />
NSString *yourString;<br />
}<br />
// Variable pour le passage du nombre (readwrite permet de faire un getter et setter automatiquement)<br />
@property (readwrite) NSNumber *myNumber;<br />
@property (nonatomic, retain) NSString *yourString;<br />
@end<br />
ViewControllerData.m
<br />
#import "ViewControllerData.h"<br />
#import "ViewControllerDataDetail.h"<br />
#import "Data.h"<br />
@interface ViewControllerData ()<br />
@end<br />
@implementation ViewControllerData<br />
// Nécessaire pour faire le getter et setter<br />
@synthesize myNumber;<br />
@synthesize yourString;<br />
- (void)loadTimeline {<br />
// Charger le modèle via RestKit<br />
RKObjectManager* objectManager = [RKObjectManager sharedManager];<br />
objectManager.client.baseURL = [RKURL URLWithString: @"http://localhost:8080/CulturalNetworksMuseumServer/resources"];<br />
[objectManager loadObjectsAtResourcePath:@"/compositecards/1/artifactcards" delegate:self];<br />
}<br />
- (void)viewDidLoad<br />
{<br />
[super viewDidLoad];<br />
<br />
<br />
// Affichage du nombre<br />
NSLog(@"Mon nombre : %i", [myNumber intValue]);<br />
NSLog(@"Mon nombre = %@", myNumber);<br />
NSLog(@"String %@", self.yourString);<br />
<br />
<br />
RKLogConfigureByName("RestKit/Network*", RKLogLevelTrace);<br />
RKLogConfigureByName("RestKit/ObjectMapping", RKLogLevelTrace);<br />
<br />
// Initialisation de RestKit<br />
RKObjectManager* objectManager = [RKObjectManager managerWithBaseURLString:@"http://localhost:8080/CulturalNetworksMuseumServer/resources"];<br />
<br />
// Active la gestion automatique de l'indicateur de l'activité réseau<br />
objectManager.client.requestQueue.showsNetworkActivityIndicatorWhenBusy = YES;<br />
<br />
//Configuration du mappage de l'objet Data<br />
RKObjectMapping * dataMapping = [RKObjectMapping mappingForClass:[Data class]];<br />
[dataMapping mapKeyPath:@"id" toAttribute:@"ac_id"];<br />
[dataMapping mapKeyPath:@"file" toAttribute:@"ac_file"];<br />
[dataMapping mapKeyPath:@"typefile" toAttribute:@"ac_typefile"];<br />
[dataMapping mapKeyPath:@"author" toAttribute:@"ac_author"];<br />
[dataMapping mapKeyPath:@"titleTopic" toAttribute:@"ac_titleTopic"];<br />
[dataMapping mapKeyPath:@"year" toAttribute:@"ac_year"];<br />
[dataMapping mapKeyPath:@"technical" toAttribute:@"ac_technical"];<br />
[dataMapping mapKeyPath:@"supportMedia" toAttribute:@"ac_supportMedia"];<br />
[dataMapping mapKeyPath:@"format" toAttribute:@"ac_format"];<br />
[dataMapping mapKeyPath:@"owner" toAttribute:@"ac_owner"];<br />
[dataMapping mapKeyPath:@"collection" toAttribute:@"ac_collection"];<br />
[dataMapping mapKeyPath:@"remarks" toAttribute:@"ac_descritpionRemarks"];<br />
<br />
<br />
// Permet de mapper l'objet Data avec la source de ce dernier<br />
[objectManager.mappingProvider setObjectMapping:dataMapping forResourcePathPattern:@"/compositecards/1/artifactcards"];<br />
<br />
// appel de la fonction qui charge le modèle<br />
[self loadTimeline];<br />
}<br />
J'espère que quelqu'un peut m'aider... Je suis débutante...
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
À la fin de imagePickerController: dans ViewControllerScan.m, tu fais une nouvelle instance de ViewControllerData et tu lui passes un nombre. Mais tu ne fais plus rien de ce contrôleur, il disparaà®t donc. Ce n'est pas lui qui est affiché quand on appuie sur le bouton de navigation du tab.
Je suis aussi débutant donc je ne sais pas quelle est la meilleure façon de faire mais il est clair qu'il faut soit:
- Ajouter une transition (Segue) vers la tab "data" et la déclencher dans ViewControllerScan.m par du code en y passant la valeur à ce moment.
- Stocker la donnée à passer dans un objet qui reste en vie plus longtemps que tes deux contrôleurs, au pire un singleton (mauvaise pratique pour cet exemple mais l'idée est de donner la valeur à un objet qui dans la logique de ton application est vivant pendant toute l'existence de ces deux tabs).
?
Parce que mon Storyboard Segues n'a pas de nom vu que la relation est un Relationship
C'est juste?
Ah oui effectivement, j'avais mal vu ton storyboard. Le prepareForSegue ne sera jamais appelé. Tu devrais peut-être stocker de façon persistante ta valeur de telle sorte qu'elle soit facilement accessible par n'importe quel controller (je rejoins l'avis de Noliv) : si l'utilisateur veut fermer ton appli, tu auras peut-être besoin de récupérer ta donnée.
Le truc un peu spécial, c'est que tu fonctionnes avec des tabs... et je ne sais pas exactement la meilleure façon de procéder.
Cependant, le plus simple me semble maintenant d'utiliser (à la fin de ton action, quand tu as le résultat du scan) la propriété pour obtenir ton deuxième tab, lui passer la valeur que tu veux, et enfin le code suivant pour activer le deuxième tab à l'écran:
Le passage de la valeur est juste? car j'ai essayé ton code, malheureusement "myNumber" = 0 alors que mon scan vaut 1...
Merci beaucoup de vous creusé la tête avec moi...
Puis depuis Scan je fait un set et depuis Data un get.
Ou bien?
Ta question sur le stockage de façon persistante m'embête un peu parce qu'on dirait qu'il faut revoir les bases de la programmation orientée objet... c'est vaste, les bouquins le font mieux que moi, et ça dépasse un peu le temps que je souhaite consacrer aux forum(s?)... /wink.png' class='bbc_emoticon' alt=';)' />
pour le placer à la place du 1 dans l'url qui suit:
j'ai essayé de faire :
mais il ne prend qu'un argument. un conseil?
Pourtant en voyant ce sujet, j'ai lancé Google, j'ai recherché la méthode "setObjectMapping:forResourcePathPattern:" et suis donc tombé en 2s sur sa documentation. Et je lis donc dan la doc de cette méthode :
Donc ça me semble clair, ce n'est pas un "%d" ou "%@ qu'il faut mettre, ce n'est pas une chaà®ne à la stringWithFormat" qu'il faut utiliser avec des placeholders pour le formattage, ce sont des "property names preceded by colons" comme le ":productID" de l'exemple donné par la doc.
Après, comment utiliser tout ça, bah ça doit aussi être expliqué dans la doc hein. J'ai mis 2s à trouver cette information donc je vous laisse trouver pour le reste comment faire ce mapping. Mais bon il me semble vu le nom des classes et des méthodes que l'objet RKObjectMappingProvider... est justement là pour ça, c'est justement son rôle de créer des mappings / correspondances entre un objet (avec ses propriétés) et la requête REST équivalente à envoyer pour récupérer les infos de cet objet...
voici la réponse:
A se demander à quoi ça te sert d'utiliser un MappingProdiver si tu fais le mapping en dur toi-même...