2012-06-19 10 views
6

Das ProblemWarum wird mein IBOutlet unter ARC veröffentlicht?

Ein IBOutlet freigegeben wird, bevor ich eine Chance haben, es zu benutzen.

Was ich

Wollen Ich will einen Navigation-Controller von meinem AppDelegate zuzugreifen, so kann ich eine Tabellenansicht neu zu laden.

Mein Setup

ich habe:

  • A Main.xib, die als meine wichtigste Schnittstelle in Zielsystemeinstellungen
  • Ein IBOutlet zum Navigationscontroller als Ivar auf meinem AppDelegate-Set
  • Dieses IBOutlet wurde an den richtigen Navigationscontroller in Main.xib angeschlossen.
  • App Delegate wird in th instanziiert e xib aber nicht als Datei-Besitzer setzen

Ich bin mit ARC, Xcode 4.3.2 und iOS5.1

Was ich Versuchte

  • Ändern Implementierungsziel
  • Setzen Sie einen Breakpoint auf Dealloc für den Navigationscontroller, App-Delegate - sie werden nie aufgerufen
  • Alles lesen, was ich auf ARC und IBOutlets finden kann - nichts scheint zu cont radict, was ich tue
  • mit einem frischen Projekt anlegen erforderlich, um eine nur den Mindest Klassen - ich sehe genau das gleiche Problem

-Code

KPAppDelegate.h

@interface KPAppDelegate : UIResponder <UIApplicationDelegate> { 
    IBOutlet KPBrowseExpensesNavigationController *nc; 
} 

@property (strong) IBOutlet KPBrowseExpensesNavigationController *nc; 

KPAppDelegate.m

@implementation KPAppDelegate 

@synthesize nc; 

-(void)setNc:(KPBrowseExpensesNavigationController *)nc_ { 
    nc = nc_; // This gets called on view load and nc gets set. 
} 

...snip... 

// This is called about 5 seconds after app startup 
-(void)objectLoader:(RKObjectLoader *)objectLoader didLoadObjects:(NSArray *)objects { 
     // By the time we get here, nc is nil. 
     UITableViewController *tvc = [[nc viewControllers] objectAtIndex:0]; 
     [[tvc tableView] reloadData]; 
} 

@end 

UPDATE

ich muss etwas wirklich dumm hier tun. Selbst ein unglaublich einfaches Projekt zeigt dieses Problem noch. Siehe Link unten.

Download a simple test project that shows the problem.

+1

Sehr sehr gutes Beispiel für eine Frage –

Antwort

2

Legen Sie in Windows Nib die FilesOwner-Klasse als UIApplication fest und zeigen Sie dann ihren Delegaten aus Outlets auf das AppDelegate-Objekt. Dies ist in Ihrem Projektbeispiel falsch.

+0

Sie, Herr, sind brillant.Dies ist mir eingefallen, aber da der Delegierte schien ausgeführt zu werden, ich Ich dachte, das wäre nicht das Problem. Ich wünschte, ich hätte das vor 5 Stunden versucht ...! Nochmals vielen Dank. –

+0

kein Problem, es ist einfacher, es in einem Projekt als eine Reihe von Codes hier zu finden sehr gut, indem ich ein Beispiel für ein Projekt erklärt habe :) –

1

Ich bin nicht sicher, warum Sie es als eine Eigenschaft & eine nicht-Eigenschaft deklarieren.Ich sollte so etwas tun:

@interface KPAppDelegate : UIResponder <UIApplicationDelegate> 

@property (nonatomic, strong) IBOutlet KPBrowseExpensesNavigationController *nc; 

Und in Ihrer Implementierung:

@implementation KPAppDelegate 

@synthesize nc = _nc; // So you don't accidentally use nc 

...snip... 

// This is called about 5 seconds after app startup 
-(void)objectLoader:(RKObjectLoader *)objectLoader didLoadObjects:(NSArray *)objects { 
     // By the time we get here, nc is nil. 
     UITableViewController *tvc = [[**self.nc** viewControllers] objectAtIndex:0]; 
     [[tvc tableView] reloadData]; 
} 

@end 

hoffe, das hilft!

+0

Danke, aber es ist immer noch Null. :(Ich habe @property eindeutig missverstanden, also danke für das Aufräumen. –

2

ist Ihre Steckdose vom Interface Builder als KPBrowseExpensesNavigationController Typ eingestellt? Wenn nicht, wird die Verbindung zwischen der Spitze und ViewController nicht hergestellt.

Sie sollten ihre Kundenspezifische Klasse als KPBrowseExpensesNavigationController im Identity Inspector

+0

Yup. Fertig. Aber danke für den Vorschlag. –

+0

und immer noch nicht funktioniert? –

+0

Immer noch nicht funktioniert. Die Steckdose/ivar ist immer noch nil. Siehe mein Update oben für ein sehr einfaches Projekt, das das Problem zeigt –

1

eingestellt habe ich nicht sehen, wo Sie Ihre nav Controller Alloc. Wenn Sie die Eigenschaft deklarieren, wird ihr kein Wert zugewiesen, also wäre sie null. Setzen Sie in Ihrem -didFinishLaunchingWithOptions im App-Delegat Ihre alloc/init-Anweisung. Alles andere sieht gut aus.

KPBrowseExpensesNavigationController *nc = [[KPBrowseExpensesNavigationController alloc] init]; 

Wenn Sie eine benutzerdefinierte init haben, können Sie das auch verwenden, aber nur sicherstellen, dass es einrichten, bevor Sie es versuchen und verwenden.

+0

Der Controller wurde in der NIB-Datei initialisiert Aber danke für den Vorschlag! –

Verwandte Themen