2010-01-20 4 views
2

A partir de la vue AI ouvre la vue B qui contient des catégories dans un uitableview, lorsque je sélectionne une catégorie, j'ouvre la vue C qui contient des sous-catégories pour la catégorie (en utilisant la persistance CoreData) dans un uitableview, quand je sélectionne une sous-catégorie, j'ouvre la vue D qui contient tout mon produit (en utilisant la persistance CoreData), quand je sélectionne le produit, comment puis-je définir la valeur dans la vue A? Éviter les fuites bien sûr ...iPhone: Récupération d'une valeur des vues

A (MainWindow) -> B (UITableView avec catégorie) -> C (UITableView avec sous-catégorie) -> D (UITableView avec produits) D-> C (avec le produit sélectionné) -> B (avec le produit sélectionné) -> A (avec le produit sélectionné)

J'espère que je suis assez understable: D

Merci

+0

Utilisez-vous un contrôleur de navigation pour pousser/pop? – shawnwall

+0

Oui, je suppose que lorsque l'utilisateur sélectionne le produit sur la vue D, le bruit doit être fait en cascade – DJYod

+0

Avez-vous un seul contrôleur de vue gérant tous ces éléments, ou un contrôleur parent que vous sous-classez? – shawnwall

Répondre

1

Cette approche suppose que vous utilisez un UINavigationController avec une pile de UIViewController cas, chacun ayant une instance de contexte de l'objet géré comme une partie d'une application de données de base.

Mettre en place un ivar et un @property dans votre tête de délégué de l'application qui contient une valeur pour le produit sélectionné (un NSManagedObjectID*, par exemple):

NSManagedObjectID *selectedProduct; 
... 
@property (nonatomic, retain) NSManagedObjectID *selectedProduct; 

Synthétiser cette ivar dans la mise en œuvre et le libérer dans -dealloc:

@synthesize selectedProduct; 
... 
- (void) dealloc { 
    [selectedProduct release], selectedProduct = nil; 
    ... 
} 

Mettre en place la macro suivante où vous conservez vos constantes, ou dans chaque en-tête de contrôleur de vue:

#define UIAppDelegate ((MyAppDelegate *)[UIApplication sharedApplication].delegate) 

De tout contrôleur de vue, par la suite, vous serez en mesure de définir et accéder à votre valeur selectedProduct, .: par exemple

NSManagedObject *foo; 

// set the property 
[UIAppDelegate setSelectedProduct:[foo objectID]]; 

// access the property 
foo = [self.managedObjectContext objectWithID:[UIAppDelegate selectedProduct]]; 

Vous ne devez pas nécessairement utiliser un NSManagedObjectID* ici. Vous pouvez utiliser n'importe quelle classe que vous aimez.

0

Une façon serait de passer le pointeur vers viewA jusqu'à viewd par tous les autres vue (contrôleurs?)

// e.g inside ViewB 
... 
ViewC *viewC = [[ViewC alloc] initWithFrame: myFrame andMainView: viewA]; 


// inside ViewD finally 
... 
[viewA setProductImageWithID: self.selctedProduct.id]; 

Une autre façon pourrait être fait viewA un singleton et instancier partout où vous devez l'utiliser . Il y a de bons exemples sur les singletons Obj-C ici sur SO.

Prenez garde, marius

ps .: espère que je suis votre problème pas complètement faux;)

+0

J'ai essayé ceci avec "délégué" B a pour le délégué A, C a pour le délégué B, D a pour le délégué C quand l'utilisateur a choisi le produit que j'ai essayé de D [délégué setProduct: theProduct] et ainsi de suite ... Cependant, je reçois un BAD_ACCESS lorsque les vues sont publiées – DJYod

Questions connexes