2012-03-27 17 views
1

ich den folgenden Code haben:UINavigationController innerhalb eines Blocks

[albumButton setAccessoryButtonPressed:^() 
      {             
       [[SoundEffectManager sharedSoundEffectManager] playSoundEffectForKey:kSoundEffectButtonPress]; 
       AlbumDetailViewController* detailVC = [[[AlbumDetailViewController alloc] initWithNibName:@"AlbumDetailViewController" bundle:nil] autorelease]; 

       [detailVC setPrice:[albumPrice stringValue]]; 
       [detailVC setCoverImage:albumCover]; 
       [detailVC setName:albumName]; 
       [detailVC setDescription:albumDesc];              
       [detailVC setProductID:[NSString stringWithFormat:@"com.tunehopper.%@", albumID]]; 
       [detailVC setComposer:composer]; 
       [detailVC setMaxScore:maxScore]; 

       for (NSString* key in songKeys) 
       { 
        NSDictionary* songDict = [albumSongs objectForKey:key]; 
        NSString*  songTitle = [songDict objectForKey:@"title"]; 

        [[detailVC dataSource] addObject:songTitle]; 
       } 

       //UINavigationController *nav = [[self.navigationController parentViewController] navigationController]; 
       [self.navigationController pushViewController:detailVC animated:YES]; 
      }]; 

Ich möchte diesen Block aus einem anderen Viewcontroller auszuführen. Das einzige, was nicht funktioniert, ist der PushViewController. Wenn ich den Push ausführe, wird der AlbumDetailViewController nicht aufgerufen. Ich frage mich, ob das Problem, das ich habe, damit zu tun hat, dass der self.navigationController nicht mehr existiert, wenn der Block ausgeführt wird. Ich hatte angenommen, dass der Block verwenden würde, was zur Zeit der aktuelle View Controller Controller zur Laufzeit existierte. Dies scheint nicht der Fall zu sein. Also, hat jemand einige Hinweise, wie ich den Block einrichten kann, um den detailViewController zur Laufzeit tatsächlich aufzurufen.

+0

Es hängt auch davon ab, wie Sie diesen Block aufrufen. Wenn Sie es an GCD übergeben, um es in einer Hintergrundwarteschlange auszuführen, wird es Probleme geben, da Sie nur UIKit-Methoden vom Hauptthread aufrufen sollen. – Abizern

Antwort

3

Putting self in einem Block ist ... nicht gerade voller Gefahr, aber wahrscheinlich Dinge tun, die Sie vielleicht nicht erwarten würden. Hier bezieht sich self auf was auch immer es im Bereich direkt außerhalb des Blocks tut, nicht auf den View-Controller, den Sie den Block ausführen. Abhängig davon, wann der Block ausgeführt wird, hat er zu diesem Zeitpunkt möglicherweise keine navigationController.

Ich würde vorschlagen, entweder den Navigationscontroller in Ihrem Block auf andere Weise nachzuschlagen (ist es der root view controller der App?), Indem Sie ihn in eine lokale Variable außerhalb des Blocks einfügen, auf die Sie dann verweisen oder haben Der View-Controller, der für die Ausführung des Blocks zuständig ist, übergibt sich selbst als Argument für den Block.

Verwandte Themen