2010-11-10 4 views
0

OK Je tire mes cheveux sur ce sujet, il n'a pas de sens si elle doit être soit un bug ou une erreur extrêmement stupide que je fais.objets dans le fichier nib ne pas associer avec des objets IBOutlet dans le code

Voici la situation: j'ai un UIViewController avec un fichier xib. Il a un UIView connecté à la propriété view, un UIImageView connecté à une propriété appelée imageView, et un UISegmentedControl connecté à segmentControl.

Pourtant, dans mon code, je suis incapable d'assigner une image à la vue de l'image. Quand je NSLog l'objet, j'obtiens l'adresse de 0x0, ainsi il ne s'associe pas du tout. J'ai les bindings mis en place dans le constructeur d'interface, j'ai redémarré XCode et nettoyé et construit le projet. Rien ne fonctionne et j'ai perdu un temps stupide à essayer de comprendre cela à ce stade. J'ai également NSLoged l'objet segmentControl et je reçois aussi 0x0. Donc rien de XIB ne se connecte avec le code, mais le XIB se charge lui-même car les objets sont affichés sur l'écran.

Est-ce que quelqu'un a des idées désinvoltes de ce que je pourrais être absent? C'est une chose tellement simple, c'est incroyablement frustrant que l'on refuse de travailler tout d'un coup.


Voici le code ci-dessous, dans ce cas, je suis d'accéder aux objets du compositeur pour projectId, mais j'ai aussi essayé d'accéder à la imageView d'une autre classe et il ne fonctionne pas non plus (et oui j'avais une @property déclaration et synthétiser pour imageView quand j'ai essayé).

DiagramViewController.h:

#import <UIKit/UIKit.h> 


@interface DiagramViewController : UIViewController 
{ 
    NSUInteger projectId; 
    IBOutlet UIImageView *imageView; 
    IBOutlet UISegmentedControl *segmentControl; 
} 

@property NSUInteger projectId; 

@end 

DiagramViewController.m:

#import "DiagramViewController.h" 

@implementation DiagramViewController 
@synthesize projectId; 

-(void)setProjectId:(NSUInteger)projId 
{ 
    NSLog(@"imageView: %@", imageView); 
    NSLog(@"segmentControl: %@", segmentControl); 

    projectId = projId; 

    NSString *filePath = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"%i_schem", projectId] ofType:@"png" inDirectory:@"project-details/images/diagrams"]; 
    NSData *imageData = [NSData dataWithContentsOfFile:filePath]; 

    imageView.image = [UIImage imageWithData:imageData]; 
} 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
    // Overriden to allow any orientation. 
    return YES; 
} 

- (void)didReceiveMemoryWarning { 
    // Releases the view if it doesn't have a superview. 
    [super didReceiveMemoryWarning]; 

    // Release any cached data, images, etc that aren't in use. 
} 

- (void)viewDidUnload { 
    [super viewDidUnload]; 
    // Release any retained subviews of the main view. 
    // e.g. self.myOutlet = nil; 
} 

- (void)dealloc { 
    [super dealloc]; 
} 

@end 

Et est ici une image des connexions ultra Builder Interface: http://i52.tinypic.com/2eakprl.png

+0

Publiez du code depuis votre contrôleur, où ces éléments sont inexistants et où vous les configurez. Ma première idée est que vous utilisez les propriétés de getter dans '-loadView', mais j'aimerais voir du code pour pouvoir répondre correctement à cette question. – jer

+0

Mise à jour du projet avec le code et la capture d'écran IB, cela n'a aucun sens, c'est le contrôleur de vue le plus simple que j'ai jamais mis en place et je refuse de travailler. –

Répondre

3

Vous devez vous assurer que vous faites cela dans la méthode -viewDidLoad, sinon le fichier nib n'a pas réellement désarchivé les objets et donc ils seront mis à zéro. En particulier, vous ne pouvez pas accéder aux éléments de la plume dans une méthode -init.

Sans voir votre code cependant, il est difficile de dire si cela est le cas pour vous.

EDIT: Ok, merci pour le code de publication. Quand est-ce que -setProjectId: est invoqué? Êtes-vous sûr que la plume a fini de charger à ce stade? Vous n'avez pas de méthode viewDidLoad dans votre contrôleur de vue, il semble donc que vous ne vérifiiez jamais cela à tout moment.

Voir: http://developer.apple.com/library/ios/#documentation/uikit/reference/UIViewController_Class/Reference/Reference.html

viewDidLoad

Appelé après le point de vue du contrôleur est chargé en mémoire.

  • (void) viewDidLoad

Discussion

Cette méthode est appelée après que le contrôleur d'affichage a chargé ses vues associées dans la mémoire. Cette méthode est appelée, que les vues aient été stockées dans un fichier nib ou créées par programmation dans la méthode loadView. Cette méthode est généralement utilisée pour effectuer des étapes d'initialisation supplémentaires sur les vues chargées à partir de fichiers nib.

+0

Merci! Déplacé la logique dans la méthode viewWillAppear: et ça marche maintenant. Je construis généralement mes contrôleurs de vue dans les méthodes viewDidLoad ou viewWillAppear: je ne sais pas pourquoi je le faisais différemment cette fois. Je savais que ça devait être une erreur stupide que je faisais. Merci encore! –

0

sonne comme quelque chose a mal tourné quand vous câblé les IBOutlets.

Dans IB faites un clic droit sur le UISegmentedControl et poster une capture d'écran afin que nous puissions voir ce que vous avez là. Si vous voyez quelque chose de «jaune» alors vous avez peut-être trouvé votre problème.

+0

J'ai peur que ce ne soit pas si simple. J'ai vérifié tout ce qui est évident. Il n'y a aucune raison que je puisse voir que cela ne fonctionne pas. Ça me fait vraiment chier. –

+0

Voir la mise à jour de mon message. J'ai inclus le code et une capture d'écran de IB –

+1

Il est hautement improbable que les objets ne soient pas chargés. Il est beaucoup plus probable qu'ils ne soient pas chargés au moment de l'accès. Lorsque vous travaillez avec des nibs, vous devez vous assurer que vous implémentez les méthodes pour fournir des informations sur l'état du contenu de la pointe (c'est-à-dire '-viewDidLoad' dans UIViewController). – d11wtq

Questions connexes