2012-03-25 24 views
2

Ich versuche, eine Kategorie auf meinem MainContainerViewController zu implementieren, die die Haupt-Instanz zurückgibt:Implementierung eines UIViewController Kategorie

In meinem .h:

@interface UIViewController(MainViewExtension) 
/** Convience method for getting access to the MainContainerViewController instance */ 
- (MainContainerViewController *)mainContainerExtension; 
@end 

In meinem .m

@implementation UIViewController(MainViewExtension) 
- (MainContainerViewController *)mainContainerExtension 
{ 
    return (MainContainerViewController *)self; 
} 
@end 

Und so von einigen Außenansicht Controller, ich selbst.mainContainerExtension auf die Instanz zugreifen, und es ist nur eine Instanz deklariert, aber es gibt mir nicht die richtige Instanz.

NSLog(@"number of children:%i", [self.mainContainerExtension.childViewControllers count]); 

Dies gibt 0 zurück, obwohl es 3 sein sollte, also weiß ich, dass es mir nicht die richtigen Ergebnisse gibt. Fehle ich etwas?

Edit: So wie ich es weiß, ist mir nicht die richtige Instanz geben, weil in der viewDidLoad der MainContainerViewController, ich habe dies:

- (void)viewDidLoad 
{ 
    appDelegate.notesViewController=[[NotesViewController alloc] init]; 
    appDelegate.notesViewController.mainContainer=self; 
    [self addChildViewController: appDelegate.notesViewController]; 
} 

Jede NotesViewController eine Eigenschaft vom Typ hat MainContainerViewController, so dass Ich habe immer eine Möglichkeit, die MainContainerViewController von NotesViewControllers zugreifen. Aber ich habe gerade etwas über Kategorien und Erweiterungen gelernt, und ich dachte, es wäre vielleicht einfacher, eine Kategorie zu implementieren, die mir Zugriff auf die Containeransicht gibt, unabhängig davon, in welcher Ansicht ich bin, anstatt eine Eigenschaft auf jedem View-Controller zu haben. Es ist mein erstes Mal, also bin ich mir sicher, dass ich etwas falsch mit meiner Kategorie-Implementierung mache, nur nicht sicher, was es ist.

+0

Versuchen Sie, ein Singleton zu erreichen? Können Sie Code einfügen, der einen fehlgeschlagenen Vergleich anzeigt? Das heißt, theExpectedHandleToVC! = Self.mainContainerExtension. Dieser Vergleich oder NSLog (@ "% p", self) ist eine direktere Art zu testen, ob es funktioniert. – danh

+0

Meine Ausgabe für 'NSLog (@% @", self.mainContainerExtension) 'ist:' '. Nicht wirklich sicher, was das bedeutet – Snowman

+0

Es ist der Zeiger auf die Instanz.Können Sie NSLog, was Sie erwarten Mit anderen Worten, was bringt Sie auf den Gedanken, dass es falsch ist? Ein typischer (nicht tabulatorgestützter) UIViewController sollte 0 childViewControllers haben. – danh

Antwort

0

Ich glaube nicht, dass Instanz Methode selbst zurückkehren kann nützlich sein. Welches Objekt Sie auch aufrufen würden: [someVC mainContainerExtension], Sie würden bereits die Antwort haben: es ist etwas VC.

Wenn jeder NotesViewController eine Eigenschaft für den enthaltenen VC hat, dann sind Sie nicht alle festgelegt? Solange es in der NotesVC Header Öffentlichkeit:

MainContainerViewController *mainVC = [[MainContainerViewController] alloc] init ...]; 

// then, after the view loads 
for (UIViewController *vc in mainVC.childViewControllers) { 
    NSLog(@"%@", (NotesViewController *)vc.mainContainer); 
} 

Beachten Sie auch, es sei denn, es gibt nur eine NotesViewController in der App, die man in AppDelegate zugewiesen bekommen überschrieben. Das Handle in dem AppDelegate wird das letzte zugewiesen sein.

Verwandte Themen