在模态 segue (ViewController) 中显示 UINavigationController?
Posted
技术标签:
【中文标题】在模态 segue (ViewController) 中显示 UINavigationController?【英文标题】:Showing UINavigationController in a Modal segue (ViewController)? 【发布时间】:2012-12-18 13:31:27 【问题描述】:我现在已经被这个问题困扰了超过 2 周!在我的项目中,我有 1 个 ViewController(slide) 我想同时启用横向和纵向。其余的所有控制器/视图(幻灯片)我只想启用纵向模式。
棘手的部分是,我所指的“ViewController”同时连接到 NavigationControllers 和 TabBarControllers。请参阅下面的方案,其中我要同时启用横向/纵向的 ViewController 被命名为:ReferredViewController.
TabBarController ----> NavigationController ----> FristViewController --(push event)--> ReferredViewController
到目前为止,我已经尝试为 NavigationControllers 和 TabBarControllers 创建一个 CATEGORY。但是由于我的 NavigationControllers 和 TabBarControllers 放置在项目的最开始,这将为整个项目设置规则。我的 ReferredViewController 放置在项目“故事板”的末尾或中间。我也尝试通过代码为单个 ReferredViewController 设置规则,但没有成功。
我最好的方法是将 FirstViewController 和 ReferredViewController 之间的事件从“推送”更改为“模态”。然后,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];
但是ofc什么也没发生,我又回到了原点:O。 FML!
【问题讨论】:
【参考方案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 的回答,这可能是你实现结果的更好方法。
【讨论】:
【参考方案2】:你必须覆盖 UITaBarController 因为它是你的基本视图控制器。我已经为我的导航控制器做了这个。告诉我这是否有帮助。
@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;
【讨论】:
以上是关于在模态 segue (ViewController) 中显示 UINavigationController?的主要内容,如果未能解决你的问题,请参考以下文章
手动模态segue不起作用,View Controller不在窗口层次结构中?
iOS Modal Segue 丢弃源 ViewController?