关于ios:在模态选择(ViewController)中显示UINavigationController?

Showing UINavigationController in a Modal segue (ViewController)?

我已经在这个问题上停留了2个多星期!在我的项目中,我有1个要同时启用横向和纵向模式的ViewController(幻灯片)。所有其他控制器/视图(幻灯片)的其余部分我仅希望启用纵向模式。

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

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

到目前为止,我已经尝试为NavigationControllers和TabBarControllers进行分类。但是由于我的NavigationControllers和TabBarControllers放置在项目的最开始,所以这将为整个项目设置规则。我的ReferredViewController放置在项目" storyboard"的末尾或中间。我试图通过代码为单个ReferredViewController设置规则,但没有成功。

我最好的办法是将FirstViewController和ReferredViewController之间的事件从" push"更改为" modal"。然后,ReferredViewController可以同时旋转人像/风景,并且项目的其余部分被锁定为人像。但是,您可能知道所有导航(NavigationBar)都将丢失,并且用户将被卡在那张幻灯片上。

因此,我尝试在ReferredViewController.m文件中使用以下代码示例启用NavigationBar:

1
2
3
4
5
6
7
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!


在此行中:

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

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

1
2
3
4
5
6
- (void)presentViewController:(UIViewController *)viewControllerToPresent
                     animated:(BOOL)flag
                   completion:(void (^)(void))completion

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

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

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

您显示的视图控制器可以自行关闭,因此

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

但是请看一下fibnochi的答案,这可能是您获得结果的一种更好的方法。


您必须克服UITaBarController,因为它是基础视图控制器。我已经为我的导航控制器完成了此操作。告诉我是否有帮助。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
@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;
 }