0

J'ai un « viewContoller » VC1 et une vue récipient avec un contrôleur de vue de table intégré dans VC1 .iOS - comment accéder à une variable de la vue du conteneur et de le transmettre au contrôleur de vue

J'ai une variable appelée nombre qui s'additionne selon le didSelectRowAtIndexPath et déduit en utilisant didDeselectRowAtIndexRowPath depuis sa table.

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    number += [[[self.sports objectAtIndex:indexPath.row] valueForKey:@"sportNumber"] intValue]; 
} 

-(void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath { 
    number -= [[[self.sports objectAtIndex:indexPath.row] valueForKey:@"sportNumber"] intValue]; 
} 

Cette valeur « nombre » appartient au contrôleur de table intégré et je dois y accéder à VC1.

De plus, la variable "nombre" change constamment en fonction de sa sélection ou de sa désélection et VC1 doit savoir quand cela se produit pour avoir la valeur la plus à jour.

Je cherchais une solution depuis des jours, toute aide serait appréciée.

Répondre

1

simple, faites comme ci-dessous,

1) Aller à l'interface constructeur et nom du jeu à votre Segue de Embed UIContainerView (disons 'abc'). Plus tard, nous allons y accéder depuis VC1 (à l'étape 4). 2) Définissez votre variable number dans l'en-tête VC1.


3) En vue tête du contrôleur de table définir une référence à votre VC1 comme celui-ci,

@property(nonatomic, retain) VC1 *VC; 

4) En classe VC1, mettre en œuvre prepareForSegue et faire comme ci-dessous,

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    NSString * segueName = segue.identifier; 
    if ([segueName isEqualToString: @"abc"]) { 
     TableViewController *tblVC = (TableViewController *) [segue destinationViewController]; 
     tblVC.VC = self; 
    } 
} 

5) Maintenant dans le contrôleur de table, vous pouvez accéder à votre variable numérique comme ci-dessous,

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

if (self.VC) { 
     self.VC.number += [[[self.sports objectAtIndex:indexPath.row] valueForKey:@"sportNumber"] intValue]; 
    } 
} 

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

if (self.VC) { 
    self.VC.number -= [[[self.sports objectAtIndex:indexPath.row] valueForKey:@"sportNumber"] intValue]; 
    } 
} 

Vous pouvez maintenant accéder number variable à partir VC1 puisqu'il est défini en-tête VC1. Rappelez-vous ceci est juste une manière d'accomplir votre condition, il y a plusieurs manières de manipuler ce genre de situations. Tels que, si vous voulez, vous pouvez faire d'autres façons.

+0

Merci pour la réponse. Je l'ai défini comme une propriété globale mais dans le contrôleur de vue de table. Alors suggérez-vous que je doive sous-classer le contrôleur de vue de table, puis déplacer les méthodes didSelect et didDeselect vers viewcontroller plutôt que dans le contrôleur de vue de table de façon à pouvoir y accéder? –

+0

@ Tony.C réponse modifiée avec la solution exacte. –

+0

Hey Prasad merci pour la réponse. Tout fonctionne execept self.VC.number dans la méthode didselect. Il ne reconnaît pas la variable numérique. Et pour cette @ propriété (nonatomic, retenez) VC1 * VC; Je l'ai remplacé par @property (non atomic, retain) UIViewController * VC; –

0

Si j'obtiens votre question correctement, vous avez une tableView à l'intérieur d'un VC et vous voulez être mis à jour quand un utilisateur a sélectionné/DidDeselect une ligne.

Une solution alternative sera d'avoir une implémentation de protocole.

@protocol SpecialTableViewFunctionDelegate <NSObject> 

@optional 
- (void)didSelectSomethingUpdatedNumber:(NSNumber *)number; 
- (void)didDeselectSomethingUpdatedNumber:(NSNumber *)number; 
@end 

Cela suppose bien entendu que vous ayez sous-classé tableView.

Sur votre sous-classe tableView vous pouvez ajouter le délégué par exemple:

@interface tableviewSubclass :UITableView 
@property (nonatomic, weak)id<SpecialTableViewFunctionDelegate>delegate; 
@end 

puis sur votre a fait méthode de sélection que vous pouvez faire quelque chose comme:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    number += [[[self.sports objectAtIndex:indexPath.row] valueForKey:@"sportNumber"] intValue]; 
    if(_delegate){ 
    if([_delegate respondsToSelector:(@selector(didSelectSomethingUpdatedNumber:)]){ 
     [_delegate didSelectSomethingUpdatedNumber:number]; 
    } 
    } 
} 

- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath { 
    number -= [[[self.sports objectAtIndex:indexPath.row] valueForKey:@"sportNumber"] intValue]; 
    if(_delegate){ 
     if([_delegate respondsToSelector:(@selector(didDeselectSomethingUpdatedNumber:)]){ 
     [_delegate didDeselectSomethingUpdatedNumber:number]; 
    } 
    } 
    } 
} 

alors sur votre CV vous suffit de affecter le délégué à soi-même. tableViewInstance.delegate = self;

Ne pas oublier d'inclure le délégué à l'en-tête <SpecialTableViewFunctionDelegate>

De cette façon, vous serez averti quand il y a une sélection/désélection de cellules

+0

Merci pour la réponse. Juste pour clarifier ma question j'ai une vue de récipient à l'intérieur du contrôleur de vue qui est embarqué avec un contrôleur de vue de table. Les méthodes ci-dessus appartiennent à la vue tabulaire et la variable "nombre" est mise à jour dans la vue tabulaire avec ces méthodes. Cependant, à mon avis, le contrôleur qui contient cette vue tabulaire (qui est incorporée à partir de la vue du conteneur) doit utiliser la variable numérique. Votre solution suppose que je peux déjà accéder à la variable que je ne peux pas. J'espère que je ne suis pas un malentendu. Je n'ai pas sous-classé la vue de la table. –

+0

@ Tony.C en fait, vous n'avez pas besoin d'y avoir accès puisque vous passez simplement le numéro sur le délégué à la vc. puisque vous n'avez pas sous-classé la tableview alors cette approche ne sera pas applicable. Je suggère de le sous-classer et de lui donner un protocole comme décrit. De cette façon, vous n'accédez pas directement à la variable mais la transmettez au délégué affecté. J'espère que j'ai fait une explication claire de mon approche suggérée – Joshua

0

partage de données entre les différentes classes peuvent être effectuées dans divers mais la façon la plus simple de faire est de garder les données partagées en dehors de toutes les classes qui utilisent/modifient cette valeur en suivant la conception faiblement couplée. On peut penser à une classe Singleton mais ce sera une surutilisation si nous n'avons qu'une seule propriété (valeur) qui est partagée. Dans ce cas, nous pouvons avoir une classe avec une variable statique interne et des méthodes de classe (avec signe +) pour y accéder. Voici le code pour le même:

.h file---> 
#import <Foundation/Foundation.h> 

@interface SharedData : NSObject 

+(void)resetNumber; 
+(void)incrementNumber; 
+(void)decrementNumber; 
+(int)getNumber; 
@end] 

.m Fichier --->

#import "SharedData.h" 

@implementation SharedData 

static int number; 

+(void)resetNumber { 
    number = 0; 
} 

+(void)incrementNumber { 
    number++; 
} 

+(void)decrementNumber { 
    number--; 
} 

+(int)getNumber { 
    return number; 
} 


@end 

est ici l'utilisation de la classe utilisation de shareddata seulement pour importer avant @implementation

[SharedData incrementNumber] 

Espérons que cela pourrait vous aider !!!!!