Ios5 故事板、片段和不同方向的不同视图

Ios5 故事板、片段和不同方向的不同视图,ios5,uinavigationcontroller,storyboard,uiinterfaceorientation,segue,Ios5,Uinavigationcontroller,Storyboard,Uiinterfaceorientation,Segue,我一直在做iOS5的工作,一直在努力处理故事板、片段和调整不同方向的视图。在经历了过去几天苹果公司的帮助之后;我没有找到一个地方来回答问题,我得出了以下结论,我将非常仔细地阐述,我希望有人能告诉我我是否正确: 1-使用故事板并不意味着你必须使用segues(是的,这对初学者来说是一种困惑) 2-您只能在属于导航控制器的VCs之间使用分段 3-另一方面,拥有导航控制器并不一定意味着你必须使用从一个VC到另一个VC的序列(是的!)。因此,如果您试图从一个VC转到另一个VC(无论第一个VC是否属于导航

我一直在做iOS5的工作,一直在努力处理故事板、片段和调整不同方向的视图。在经历了过去几天苹果公司的帮助之后;我没有找到一个地方来回答问题,我得出了以下结论,我将非常仔细地阐述,我希望有人能告诉我我是否正确:

1-使用故事板并不意味着你必须使用segues(是的,这对初学者来说是一种困惑)


2-您只能在属于导航控制器的VCs之间使用分段

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

假设您有一个WhiteVC类和一个YellowVC类,并且在WhiteVC视图上放置了一个按钮(在故事板中,并将通用VC的类更改为WhiteVC),并将其链接到WhiteVC类中的iAction。这是您将在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];
} 
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;
  }
 }
这将关闭黄色VC并返回到白色VC

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

5-现在所有这些都是因为我正在构建一个应用程序,它有一个导航控制器,但是它的根VC会不同(不同的VC有不同的视图),这取决于它是横向的还是纵向的。因此,我可以通过编程方式(如上面的#3)实例化VCs,这两种方式都很好地工作。或者,如果我想使用segues进行转换,apple帮助文档提供以下代码:

-(IBAction)ReturnToWhiteVC 
{
  [self dismissViewControllerAnimated:YES completion:nil];
} 
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;
  }
 }
上面的代码显然只适用于导航控制器(因为有分段),当方向从纵向变为横向时,它起作用,但当我旋转回纵向时,我最终将横向VC旋转回纵向。我做错了什么

我希望有人能验证/确认这些观点并回答我的问题。 谢谢
KB.

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

苹果的文档还说,您必须限制每个
UIViewController
支持的方向,您将使用它们来处理方向,也就是说,您必须限制纵向到纵向,横向到横向)。这可以按照以下文件进行:

  • 对于iOS 6及更高版本:覆盖

  • 对于iOS 5及更早版本:覆盖

然后,为了使用Apple design来管理定位,您可以遵循

它基本上描述了如何使用嵌入导航控制器中的两个显示相同内容(一个用于横向,一个用于纵向)的视图控制器来设计视图层次结构。两个视图控制器都应该能够推动能够自动旋转的hird视图控制器

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


您应该能够使其代码适应您自己的视图层次结构。

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

苹果的文档还说,您必须限制每个
UIViewController
支持的方向,您将使用它们来处理方向,也就是说,您必须限制纵向到纵向,横向到横向)。这可以按照以下文件进行:

  • 对于iOS 6及更高版本:覆盖

  • 对于iOS 5及更早版本:覆盖

然后,为了使用Apple design来管理定位,您可以遵循

它基本上描述了如何使用嵌入导航控制器中的两个显示相同内容(一个用于横向,一个用于纵向)的视图控制器来设计视图层次结构。两个视图控制器都应该能够推动能够自动旋转的hird视图控制器

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


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

“2-您只能在属于导航控制器的VCs之间使用分段。”我也有同样的问题。如果我将横向视图控制器上的segue类型更改为“Modal”,则我无法获得您描述的行为,但我丢失了导航条,这不是我想要的,但比“2-您只能在属于导航控制器的VCs之间使用segue”之前的情况要好。我也有同样的问题。如果我将横向视图控制器上的segue类型更改为“Modal”,则我无法获得您描述的行为,但我丢失了导航条,这不是我想要的,但比以前更好