2011-01-15 18 views
3

Ich habe ein Problem beim Zugriff auf ein IBOutlet.iPhone - Zugriff auf ein IBOutlet (nullwertig) nicht möglich

Ich habe eine NIB innerhalb der es eine Tabellenansicht, eine Symbolleiste und ein UILabel (in einer Ansicht gekapselt) gibt. Der Controller (das ist der Eigentümer der Datei) ist definiert als:

@interface ChoixPeriodeController : UIViewController <UITableViewDelegate> { 
IBOutlet UILabel* __periodeInitialeLabel; 
} 

@property(nonatomic, retain) UILabel* periodeInitialeLabel; 

- (void) setSelectedPeriode:(Tache_TypePeriode)typePeriode; 

mit @synthetize periodeInitialeLabel = __periodeInitialeLabel;

In der .m-Datei, wird diese Funktion durch das übergeordnete Fenster genannt Label INIT:

- (void) setSelectedPeriode:(Tache_TypePeriode)typePeriode { 
NSMutableString* tmpString = [NSMutableString string]; 

[tmpString appendFormat:some text format....]; 

self.periodeInitialeLabel.text = tmpString; 
} 

In dieser Funktion kann ich sehen, dass self.periodeInitialeLabel auf Null ist. Ich kann nicht sehen warum. Alles ist in IB verbunden ... Siehst du, was das Problem sein kann?

+2

Legen Sie einen Haltepunkt auf ViewDidLoad - die zuerst aufgerufen wird? viewDidLoad oder setSelectedPeriode? – makdad

+0

@phooze: OK ... Es ist SetSelectedPeriode .... Ich muss mit einem weiteren Klassenattribut umgehen :-) Oder hast du eine andere Lösung? – Oliver

+1

@Joe Schlag: Können Sie nicht alle Kappen mit Französisch verwenden? Was die Welt von Ihnen braucht, ist erstaunlich, unglaublich elegant FRANZÖSISCH STUFF !!!!! – MusiGenesis

Antwort

5

Die Frage hier ist die Reihenfolge der Operationen. Wenn das Textlabel immer noch Null ist, wurde es wahrscheinlich noch nicht eingerichtet. Stattdessen können Sie diese Methode innerhalb der UIViewController-Methode viewDidLoad aufrufen, um Operationen wie diese auszuführen, die "zusätzliche Konfiguration" ausführen müssen, die in Interface Builder nicht ausgeführt werden konnte.

Es gibt auch awakeFromNib. Sie sind sehr ähnlich, außer dass wakeFromNib ONCE aufgerufen wird, wenn die NIB-Datei nicht entpackt ist. viewDidLoad kann oft aufgerufen werden - zum Beispiel, wenn es eine Situation mit wenig Speicher (oft auf iOS4 passiert), werden Ihre Ansichten über viewDidUnload gelöscht werden.

0

Ich denke, Ihr Eigentum hat auch mit IBOutlet definiert werden, wie:

@property(nonatomic, retain) IBOutlet UILabel* periodeInitialeLabel; 

und Sie müssen die Eigenschaft in Ihrer Implementierungsdatei @synthesize, und dann sicher periodeInitialeLabel machen richtig in IB verdrahtet (dh nicht `__periodeInitialeLabel ');

Update:

Wenn Ihr synthesize Aussage wie folgt aussieht:

@synthesize periodeInitialeLabel; 

dann ist das wahrscheinlich Ihr Problem. Ich denke, dass es das sein muss:

@synthesize periodeInitialeLabel = __periodeInitialeLabel; 

, um es an Ihr Feld anzuschließen.

+0

Hey MusicGenesis - solltest du nicht gerade AMATING MUSIC machen, wie wir es in diesem anderen Beitrag besprochen haben? :) – Fattie

+0

Hey, es ist Samstag. Kann ich nicht einen freien Tag pro Woche haben? – MusiGenesis

+0

@Joe: nur "ziemlich sicher"? :-) Ich weiß nicht - Ich habe aufgehört, IB ganz zu benutzen, und ich bin jetzt viel glücklicher. – MusiGenesis

0

diese Schnittstelle Gegeben:

@interface ChoixPeriodeController : UIViewController <UITableViewDelegate> {  
    UILabel* __periodeInitialeLabel; 
} 

// I think it's more appropriate to mark a property with IBOutlet, 
// rather than an ivar 
@property(nonatomic, retain) IBOutlet UILabel* periodeInitialeLabel; 

- (void) setSelectedPeriode:(Tache_TypePeriode)typePeriode; 

// ... 

@end 

ihre Umsetzung sollte wie folgt aussehen:

@implementation ChoixPeriodeController 

@synthesize 
periodeInitialeLabel = __periodeInitialeLabel; 

// the rest of your implementation goes here 
// ... 

@end 

ich auch Sie am Google Objective-C Style Guide aussehen würde vorschlagen. Die Benennung Ihrer Ivars mit zwei führenden Unterstrichen ist möglicherweise nicht die beste Wahl.

+0

Danke. Da es keine Nebenwirkungen zu haben scheint, ziehe ich es vor, den ivar als IBOutlet zu markieren, um mir zu zeigen, welche Attribute im Code wichtig sind und welche nicht. Wenn ich über die Unterstreichung spreche, werde ich mich mit meiner Methode beschäftigen. Wenn Sie den Unterstrich am Ende platzieren, wird nichts aufgrund von Autovervollständigung verhindert, was dazu führen kann, dass ich Fehler mache. – Oliver

4

Für jeden, der immer noch Probleme damit hatte, war ich sogar in einer Beispiel-App mit etwas ähnlichem konfrontiert.Die Antwort stellte sich heraus, dies zu sein:

UIImageView Created In Interface Builder Set To nil When Needed

[self memberVar] 

Lädt die Eigenschaft, während:

self.memberVar 

einfach den aktuellen Wert zugreift, die Null bleiben wird. Also versuche ich, das "." Operator. Dies ist ein sehr subtiles Problem, das ich in letzter Zeit in vielen Beispielcodes gesehen habe. Die Unterstrich-Methode in den neueren Beispielen:

@synthesize memberVar = _memberVar; 

noch bleibt nur die Membervariable Null, bis Sie es mit [self memberVar] zugreifen. Ich denke, Apple das Problem zu vermeiden, indem sie unter Bezugnahme auf _memberVar bei der Umsetzung (zB in dealloc mit [_imageView release])


UPDATE kann versuchen: Auch wenn Sie mit initWithNibName oder loadNibNamed einen Controller laden von eine Feder oder xib on the fly (zum Beispiel eine benutzerdefinierte UITableViewCell), vergessen rufen Sie nicht:

[self loadView]; 

Dies lädt auch die Elementvariablen. Sie werden nicht automatisch geladen, es sei denn, die Ansicht wird angezeigt oder pushViewController wird auf eine navigationController.

Verwandte Themen