2012-03-27 41 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

我建议或者以不同的方式查看块内的导航控制器(也许是应用程序的根视图控制器,或许?),将它放在块之外的局部变量中,负责执行块的视图控制器将自己作为参数传递给块。