2012-03-27 40 views
1

我有下面的代碼裏面:UINavigationController的塊

[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]; 
      }]; 

我想從一個不同的viewController執行此塊。唯一不工作的是pushViewController。當我執行推送時,不會調用AlbumDetailViewController。我想知道我遇到的問題是否與執行塊時不再存在的self.navigationController有關。我曾假設該塊將使用運行時存在的任何當前視圖控制器導航控制器。這似乎並非如此。那麼,有沒有人有一些關於如何設置塊來在運行時調用detailViewController的指針。

+0

這也取決於你如何調用這個塊。如果您將它傳遞給GCD以在後臺隊列上運行,則會出現問題,因爲您只應從主線程調用UIKit方法。 – Abizern 2012-03-28 00:15:11

回答

3

self放在一個塊裏面......並不完全充滿危險,但可能會做你可能不期望的事情。這裏,self指的是它在直接在塊之外的作用域中執行的任何操作,而不是你正在執行該塊的視圖控制器。根據塊執行的時間,當時可能沒有navigationController

我建議或者以不同的方式查看塊內的導航控制器(也許是應用程序的根視圖控制器,或許?),將它放在塊之外的局部變量中,負責執行塊的視圖控制器將自己作爲參數傳遞給塊。