2013-10-17 17 views
3

关于何时使用UIViewContoller与UIView有一些很好的答案。例如herehere应用程序结构:分页界面中的UIView与UIViewController

的一般要点是,一个UIViewController应该用于控制数据的完整画面,因为

  1. 它被设计成手柄转动。一次只能有一个UIViewController在屏幕上,因为only the newest将被通知轮换发生。

  2. 要保持对MVC范例的真实性,您的业务逻辑应该存在于UIViewController中,而只有显示和交互逻辑应该存在于UIView中。推测商业逻辑与整个屏幕上的内容有关。

我的问题是,鉴于此,我该如何在几个顶层视图之间使用左右分页来构造应用程序?

我想用几个UITableViews创建一个接口,并保存一系列配方。用户左右滑动以在列表之间导航。底部有一个共同的菜单,无论如何都保持固定。

我最初的想法是为UIScrollView使用一个UIVIewController,然后从那里添加子视图。

但是我真的很喜欢每个列表都有它自己的UIViewController,所以它可以处理自己的旋转,并保持业务逻辑像它自己的REST方法。让顶层的UIViewController处理子视图的旋转似乎是一件痛苦的事情,而且将逻辑放在其他任何地方似乎违反了MVC。

有没有一种方法来构建一个应用程序,以便多个UIViewControllers住在UIScrollView中,还是适合使用一系列顶级UIViewControllers和UISwipeGestureRecognizer来模拟UIScrollView的分页效果?

谢谢。

回答

2

一对夫妇的想法:

  1. 如果定位的iOS 5及更高版本,我建议使用UIPageViewController这是专为正是这个UI(刷卡在UIViewController实例之间来回)。然后,您将为每个配方分别提供UIViewController。在iOS 5中,您只有UIPageViewControllerTransitionStylePageCurltransition style,但在iOS 6中,您也有UIPageViewControllerTransitionStyleScroll

    有关更多信息,请参阅适用于iOS的视图控制器目录的Page View Controller部分。

  2. 这比编写自己的基于滚动视图的解决方案简单得多。如果使用UIScrollView“滚动自己”,则需要删除滚动屏幕外的实例(通过注册滚动视图的delegate并响应scrollViewDidScroll),以免不必要地占用内存。

    如果您确实将子视图控制器添加到滚动视图中,请不要忘记调用相应的custom container calls。特别是,当您添加视图控制器到您的滚动视图,请确保您拨打以下(假设controller是孩子控制器和self是主视图控制器):

    [self addChildViewController:controller]; 
    [self.scrollView addSubview:controller.view]; 
    [controller didMoveToParentViewController:self]; 
    

    正如您回应scrollViewDidScroll删除视图控制器不再可见,做相应的清除调用,如:

    [controller willMoveToParentViewController:nil]; 
    [controller.view removeFromSuperview]; 
    [self removeChildViewController:controller]; 
    

    有关为何调用这些定制容器调用是很重要的信息,请参阅WWDC 2011的视频Implementing UIViewController Containment

  3. 但是,我绝对不会推荐使用UINavigationController,因为它会将所有以前的页面保留在内存中。

1

我相信你所说的要求你可以使用UINavigationController。它会给你你想要的“左右”分页,你可以为你的每个食谱使用UIViewController

此外,我认为你想使用UIScrollView,因为它可以让你执行一个“滑动”手势。如果是这种情况,您还可以将UISwipeGestureRecognizer添加到您的视图控制器,每次识别该手势时,请致电pushViewController:animated:popViewControllerAnimated:在您的配方之间执行导航。

这只是和想法。

希望这会有所帮助!

1

据我看到的,有2点不错的选择:

  1. 使用根的UINavigationController和推/弹出子 ViewControllers取决于轻扫手势 的方向(由UISwipeGestureRecognizer认可,就像你说)。

  2. 使用带有UIScrollView的根UIViewController并将子视图控制器视图添加为scrollview子视图。为了处理 方向的变化,你可以通过方向变化 的UIViewController方法(willRotateToInterfaceOrientationdidRotateFromInterfaceOrientation)孩子控制器,所以他们 能够处理它们。

我希望我帮助

+0

谢谢,直接传递orientation-change方法的好主意 – bcattle

+0

@bcattle如果你调用适当的[容器视图控制器方法](https://developer.apple.com/library/ios/documentation/uikit/reference/ UIViewController_Class/Reference/Reference.html#// apple_ref/doc/uid/TP40006926-CH3-SW81),您不必手动传递这些旋转方法。它们会自动被传递(这是实现容器的许多原因之一)。您可以_can_,如果需要,通过返回'NO'来响应'shouldAutorotateToInterfaceOrientation',但禁用该行为,但默认情况下,容器会自动将这些旋转事件传递给其子项。 – Rob

1

首先,您应该知道,自iOS 5以来,可以在您的主视图控制器中包含子视图控制器。

https://developer.apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/CreatingCustomContainerViewControllers/CreatingCustomContainerViewControllers.html

所以,在我看来,一个不错的选择将有一个分页的UIScrollView作为主控制器,然后把你的孩子控制器的情况下,在每个页面。因为这可能都有一点内存密集,你应该在任何时候只有三个实例(一个正在显示,一个是任何一方,以便他们如果用户开始滚动就准备好了)。苹果示范项目展示了如何配置一个滚动视图这样的:

https://developer.apple.com/library/ios/samplecode/PageControl/Introduction/Intro.html#//apple_ref/doc/uid/DTS40007795

希望有所帮助。