UINavigationController внутри блока - PullRequest
1 голос
/ 28 марта 2012

У меня есть следующий код:

[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. Когда я выполняю push, AlbumDetailViewController не вызывается. Мне интересно, связана ли проблема, связанная с тем, что self.navigationController больше не существует при выполнении блока. Я предполагал, что блок будет использовать любой существующий контроллер навигации представления контроллера, существующий во время выполнения. Это не похоже на случай. Итак, есть ли у кого-нибудь указания на то, как я могу настроить блок для фактического вызова detailViewController во время выполнения.

1 Ответ

3 голосов
/ 28 марта 2012

Помещение self в блок ... не совсем чревато опасностью, но, вероятно, приведет к тому, чего вы не ожидаете.Здесь self относится к тому, что он делает в области непосредственно за пределами блока, а не к контроллеру представления, который вы выполняете в блоке.В зависимости от того, когда исполняется блок, он может не иметь navigationController в то время.

Я бы предложил либо поискать навигационный контроллер внутри вашего блока другим способом (это корневой контроллер приложения, возможно?), помещая его в локальную переменную вне блока, на который вы затем ссылаетесь, или заставляя контроллер представления, ответственный за выполнение блока, передавать себя в качестве аргумента блоку.

...