我一直在开发 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 旋转回纵向。我在这里做错了什么?
我希望有人可以验证/确认这些观点并回答我的问题。谢谢知识库。