2012-03-01 2 views
1

J'essaye d'obtenir une variable d'une classe que j'ai faite d'une vue de table. Fondamentalement, ce que je veux que ce soit de dire à l'autre contrôleur quelle ligne a été sélectionnée, c'est ce que j'ai essayé de faire.Objective C accéder aux variables d'autres classes?

Table Voir le fichier de classe:

@property(nonatomic) NSInteger itemId; 
-(NSInteger)itemId; 

Je voudrais ensuite faire des méthodes définir et obtenir la variable dans le fichier .m du Tableau de classe (j'ai synthétisé et fait tout ce genre de choses, Je vous montre les méthodes)

-(NSInteger)itemId { 
return self.itemId; 
} 

Et maintenant la cellule de table méthode choisie ...

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *) 
indexPath { 
NSUInteger row = [indexPath row]; 
self.itemId = row; 
//segue stuff (if you want me to include this just let me know) 
} 

est tout pour cette classe et maintenant la classe que j'ai besoin de la valeur pour View classe Controller .h qui est poussé par Segue

@property (nonatomic) NSInteger itemId; 

View Controller Class

#import "TableViewController.h" 
//Skip a few things 
@synthesize itemId; 
//skip a few things 
-(void)viewDidLoad { 
TableViewController *tvc = [[TableViewController alloc] init]; 
itemId = [tvc itemId]; 
NSLog(@"%i", itemId); 

Pour certains raison pour laquelle cela ne fonctionne pas ... Quand j'imprime le "itemId" dans la méthode "didselectrow" il renvoie le bon nombre mais quand j'essaie de l'imprimer dans l'autre classe il me donne juste '0' ? S'il y a des choses que j'ai omises que vous voulez voir dans mon code, je serais plus qu'heureux de les écrire :) Je voulais juste gagner du temps et de l'espace en réduisant un peu le code. Merci d'avance!

EDIT: J'ai trouvé une solution possible mais cela implique l'utilisation du délégué. Je suis sûr qu'il doit y avoir une meilleure façon de le faire, donc si vous avez des idées, faites le moi savoir.

+2

N'appelez-vous jamais le getter 'itemId' de votre classe de vue de table? Assez sûr que cela provoque une boucle infinie; vous devriez le changer en 'return itemId'. – yuji

Répondre

0

Le - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *) est pas invoqué - vous devez sélectionner une ligne pour modifier la valeur de itemId, et qui n'est pas possible entre l'initialisation de la table et la ligne itemId = [tvc itemId];.

0

Essayez ceci:

@property NSInteger itemId; 

Hope this vous aide

0

ce code peut vous aide.

#import <UIKit/UIKit.h> 

extern int outsider; 

@interface ViewController : UIViewController { 

} 

@property int outsider; 

@end 

à tous les fichiers .m vous #import le fichier .h où vous déclarez la variable peut acces elle.

2
TableViewController *tvc = [[TableViewController alloc] init]; 

Faire cela dans une autre classe que vous créez & initialiser un nouvel objet, il sera Nill (pour int 0). Pour le partage des données entre les classes &, les contrôleurs utilisent des délégués et des propriétés. Avec un petit code, je vais expliquer;

#import <UIKit/UIKit.h> 

    //YourClassNameAppDelegate.m 
    @interface YourClassName : UIResponder <UIApplicationDelegate> 
    { 
     NSString *uName; 
     NSDictionary *YourDictionary; 
    } 

    @property (copy, readwrite) NSString *uName; 
    @property (copy, readwrite) NSString *YourDictionary; 

And in the other class you want to use this string and dictionary, 

    //import your delegate class 
    #import "YourClassNameAppDelegate" 
    . 
    . 
    . 
    //to me, do this in viewDidLoad(or something like that) method of new view controller 
    YourClassNameAppDelegate *sharedData= (YourClassNameAppDelegate *)([[UIApplication sharedApplication]delegate]); 
    . 
    . 
    -(IBAction)sharedData{ 
     NSLog(@"Shared String: %@\n And Shared Dictionary: %@, sharedData.uName, sharedData.YourDictionary); 

    } 
0

Vous créez une nouvelle instance de votre contrôleur de vue de table au sein de votre contrôleur de vue détaillée, ce qui est faux et ne va pas vous donner une référence à votre table d'origine.

Créez simplement une propriété sur votre contrôleur de vue poussé qui contient toutes les informations détaillées que vous souhaitez transmettre. Ensuite, définissez ceci dans prepareForSegue: dans votre contrôleur de vue de table, où segue.destinationViewController vous donnera un pointeur vers le VC qui est sur le point d'apparaître.

De même, corrigez votre méthode d'accès comme suggéré par Yuji dans les commentaires.

0

Je suggère de sauvegarder l'indexPath pour la ligne pressée dans un singleton. Voici un guide sur la façon d'utiliser le singleton class pour stocker des objets et les utiliser à travers les classes.

Dans cet exemple, vous pouvez également déclarer une variable d'instance dans le singleton et la définir lorsque la ligne est enfoncée dans la méthode de délégation appropriée pour votre UITableView. Cela pourrait se faire comme ceci:

#import <Foundation/Foundation.h> 
@interface Singleton : NSObject { 

NSIndexPath *tableViewPath; 

} 

#import "DataContainerSingleton.h" 
@implementation DataContainerSingleton 

@synthesize tableViewPath; 

static DataContainerSingleton* _theDataContainerSingleton = nil; 

+ (DataContainerSingleton*) theDataContainerSingleton; 
{ 
    if (!_theDataContainerSingleton) 
    _theDataContainerSingleton = [[DataContainerSingleton alloc] init]; 
    return _theDataContainerSingleton; 
} 

- (id)init 
{ 
    self = [super init]; 
    if (self) { 

      tableViewPath = [NSIndexPath indexPathForRow:0 inSection:0]; 
    } 

    return self; 
} 

Dans votre contrôleur de vue avec le UITableView faire comme ceci:

@implementation 

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

tableViewPath = indexPath; 

} 

Vous devez ajuster votre initialisation à ce qui être approprié pour votre programme spécifique!

+0

Quand je fais 'tableViewPath = indexPath', devrais-je simplement l'importer? Ou devrais-je faire 'DataContainerSingleton * dataContainer = [[DataContainerSingleton alloc] init]; et utilisez une méthode getter pour obtenir la variable de cette classe? – user1242108

+0

Oh désolé je l'ai mentionné. Oui, ce serait exactement ce que vous deviez faire. Comme ceci: [DataContainerSingleton theDataContainerSingleton] .tableViewPath = indexPath; – wizH

Questions connexes