在Modal segue(ViewController)中显示UINavigationController?

时间:2012-12-18 13:31:28

标签: ios rotation modal-dialog modalviewcontroller

我已经被困在这个问题上超过2周了!在我的项目中,我有一个单一的ViewController(幻灯片)我想要启用横向和纵向。其余的所有控制器/视图(幻灯片)我只想启用纵向模式。

棘手的部分是,我所指的“ViewController”连接到NavigationControllers和TabBarControllers。请参阅下面的方案,其中我想要启用横向/纵向的ViewController命名为: ReferredViewController。

TabBarController ----> NavigationController ----> FristViewController - (推送事件) - > ReferredViewController

到目前为止,我已尝试为NavigationControllers和TabBarControllers创建 CATEGORY 。但由于我的NavigationControllers和TabBarControllers放置在项目的最开始,这将为整个项目设置规则。我的ReferredViewController放置在项目“storyboard”的末尾或中间。我试图通过代码设置规则以及单个ReferredViewController,但没有任何成功。

我最好的方法是将FirstViewController和ReferredViewController之间的事件从“push”更改为“modal”。然后,ReferredViewController可以旋转纵向/横向,并且项目的其余部分以纵向锁定。但是,您可能知道所有导航(NavigationBar)都将丢失,用户将卡在该单张幻灯片上。

所以我试图在 ReferredViewController.m文件中使用以下代码示例启用NavigationBar:

ShowTaskViewController *detailViewController = [[ShowTaskViewController alloc] init];
UINavigationController *navController = [[UINavigationController alloc]     initWithRootViewController:detailViewController];

navController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
[self.navigationController presentModalViewController:navController animated:YES  completion:nil];
[navController release];
[detailViewController release];

但是没有任何事情发生,我又回到了原点:O。 FML!

2 个答案:

答案 0 :(得分:1)

在这一行:

[self.navigationController presentModalViewController:navController 
                                             animated:YES  
                                           completion:nil];

你正在混淆两个UIViewController实例方法:

- (void)presentViewController:(UIViewController *)viewControllerToPresent 
                     animated:(BOOL)flag 
                   completion:(void (^)(void))completion

- (void)presentModalViewController:(UIViewController *)modalViewController 
                          animated:(BOOL)animated

其中第一个现在是标准,第二个方法在ios6中已弃用。

此外,呈现视图控制器应该是self(ReferredViewController),而不是self的navigationController。

您呈现的视图控制器可以解雇自己

 [[self presentingViewController] dismissViewControllerAnimated:YES 
                                                     completion:(void (^)(void))completion];

但是看一下fibnochi的回答,这可能是你获得结果的更好方法。

答案 1 :(得分:0)

你必须覆盖UITaBbarController,因为它是你的基本视图控制器。我已经为我的导航控制器做了这个。告诉我这是否有帮助。

@interface UINavigationController (Autorotation)

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation;
- (BOOL) shouldAutorotate;
- (NSUInteger) supportedInterfaceOrientations;
@end

@implementation UINavigationController (Autorotation)

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation{

if ([self.visibleViewController isKindOfClass:[MWPhotoBrowser class]] || [self.visibleViewController isKindOfClass:[ZoomPictureViewController class]]) {
    return YES;
}
return  (toInterfaceOrientation == UIInterfaceOrientationPortrait);
}

-(BOOL) shouldAutorotate{
    return YES;
}

-(NSUInteger) supportedInterfaceOrientations{

    if ([self.visibleViewController isKindOfClass:[MWPhotoBrowser class]] ||     [self.visibleViewController isKindOfClass:[ZoomPictureViewController class]]) {
    return UIInterfaceOrientationMaskAll;
}

return UIInterfaceOrientationMaskPortrait;
 }