1

我一直在开发 iOS5,并且一直在为故事板、segues 和针对不同方向调整视图而苦苦挣扎。在过去几天经历了一些苹果的帮助之后;我还没有找到答案的地方,我得出了以下结论,我会非常仔细地表达出来,希望有人能告诉我我是否正确:

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

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

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

假设您有一个 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),效果很好。或者,如果我想使用 segues 进行转换,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 旋转回纵向。我在这里做错了什么?

我希望有人可以验证/确认这些观点并回答我的问题。谢谢知识库。

4

1 回答 1

1

首先:segue 不仅仅适用于 a UINavigationController, anyUIViewController都可以执行 segue。

Apple 文档还说,您必须限制每个UIViewController用于处理方向的支持的方向,即您必须将纵向限制为仅纵向,将横向限制为仅横向)。这可以按照文档完成:

然后,为了使用 Apple 设计来管理方向,您可以关注Alex Moffat 的这篇博文

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

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

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

于 2013-01-15T13:13:45.017 回答