故事板,Segues和不同方向的不同视图

时间:2012-05-04 14:49:16

标签: ios5 uinavigationcontroller storyboard uiinterfaceorientation segue

我一直在iOS5上工作,并且一直在努力学习故事板,细分和调整不同方向的视图。在过去的几天里经过一些Apple的帮助之后;我没有为我的答案找到一个地方,我得出以下结论,我将非常仔细地表达,我希望有人可以告诉我,如果我是正确的:

1-使用故事板并不意味着你必须使用segues(是的,这对于初学者来说是混乱的。)

2-您只能在属于导航控制器的VC之间使用segue。

3-另一方面,拥有导航控制器并不一定意味着你必须使用从一个VC到另一个VC的segue(是的!)。因此,如果您尝试从一个VC转到另一个VC(无论第一个VC是否属于Nav控制器),您可以执行以下操作:

假设您有一个WhiteVC类和一个YellowVC类,并且您在WhiteVC视图上放置了一个按钮(在故事板中并将通用VC的类更改为WhiteVC)并将其链接到WhiteVC类中的IBAction。这将是您在WhiteVC.m中实现的代码,以便能够单击该按钮并显示YellowVC视图:

-(IBAction)GoToYellow 
{
  YellowViewController *YellowVC=[self.storyboard instantiateViewControllerWithIdentifier:@"myYellowVC"];                                             
  [self presentViewController:YellowVC animated:YES completion:nil];
}

要从YellowVC返回到WhiteVC,您将在YellowVC视图上创建另一个按钮(按照与上面相同的过程)并使用以下代码:

-(IBAction)ReturnToWhiteVC 
{
  [self dismissViewControllerAnimated:YES completion:nil];
} 

这将解除YellowVC并返回White VC。

4-建议不要让一个VC拥有(实例化)多个视图 - 例如,对于不同的方向 - 最好为每个视图设置一个单独的VC。可以让VC将其他VC实例化为MVC的一部分。

5-现在所有这一切都是因为我正在构建一个具有导航控制器的应用程序,但其根VC将是不同的(具有不同视图的不同VC),具体取决于它是横向还是纵向。所以我可以以编程方式实例化VC(如上面的#3),这种方法效果很好。或者,如果我想使用segue进行转换,那么apple帮助文档提供以下代码:

BOOL isShowingLandscapeView;
- (void)awakeFromNib
{    
  isShowingLandscapeView = NO;

  [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
  [[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(orientationChanged:)
                                             name:UIDeviceOrientationDidChangeNotification
                                           object:nil];
}


- (void)orientationChanged:(NSNotification *)notification
{ 
  UIDeviceOrientation deviceOrientation = [UIDevice currentDevice].orientation;
  if (UIDeviceOrientationIsLandscape(deviceOrientation) && !isShowingLandscapeView)
  {
    [self performSegueWithIdentifier:@"AlternateView" sender:self];  
    isShowingLandscapeView = YES;
  }

  else if (UIDeviceOrientationIsPortrait(deviceOrientation) && isShowingLandscapeView)
  {
    [self dismissViewControllerAnimated:YES completion:nil];// breakpoint shows that this is triggered
    isShowingLandscapeView = NO;
  }
 }

上面的代码显然只适用于导航控制器(由于segues),并且当方向从纵向更改为横向时它起作用,但当我旋转回纵向时,我最终将风景VC旋转回纵向。我在这做错了什么?

我希望有人可以验证/确认这些要点并回答我的问题。 谢谢 KB。

1 个答案:

答案 0 :(得分:1)

首先:segues不仅适用于UINavigationController,任何UIViewController都可以执行segue。

Apple文档还说,您必须限制用于处理方向的每个UIViewController的支持方向,即您必须将纵向限制为仅限纵向,仅限于横向设置为横向。这可以在doc:

之后完成

然后,为了使用Apple设计来管理方向,您可以关注this blog post by Alex Moffat

它基本上描述了如何使用两个视图控制器设计视图层次结构,这两个视图控制器显示相同的内容(一个用于Landscape,一个用于Portrait),嵌入在Navigations Controller中。两个视图控制器都应该能够推动能够自动旋转的第三视图控制器。

主要思想是在导航堆栈上推送/弹出Landscape视图,并相应地处理第三个视图的转换。

您应该能够将其代码调整到您自己的视图层次结构中。