关于何时使用UIViewContoller与UIView,有一些很好的答案。例如herehere

一般要点是,应该使用UIVIewController来控制全屏数据,因为

  • 用于处理旋转。屏幕上一次只能显示一个UIViewController,因为only the newest将被通知发生了旋转。
  • 为了忠于MVC范例,您的业务逻辑应位于UIViewController中,而只有显示和交互逻辑应位于UIView中。大概业务逻辑与整个屏幕上的内容有关。

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

    我想要创建一个包含几个包含配方列表的UITableViews的接口。用户左右滑动可在列表之间导航。底部有一个共同的菜单,无论如何都不会改变。

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

    但是,我真的希望每个列表都有自己的UIViewController,以便它可以处理自己的轮换,并像自己的REST方法一样保存业务逻辑。让顶层的UIViewController处理子视图的旋转似乎很痛苦,并且把逻辑放在其他地方似乎违反了MVC。

    是否可以构建一个应用程序,以使多个UIViewController驻留在一个UIScrollView中,还是适合使用一系列顶级UIViewController和UISwipeGestureRecognizer来模拟UIScrollView的分页效果?

    谢谢。

    最佳答案

    一些想法:

  • 如果面向iOS 5及更高版本,我建议使用专门针对此UI设计的 UIPageViewController (在UIViewController实例之间来回切换)。然后,每个配方将有一个单独的UIViewController。在iOS 5中,您只有UIPageViewControllerTransitionStylePageCurl transition style,但是在iOS 6中,您还有UIPageViewControllerTransitionStyleScroll

    有关更多信息,请参见iOS的View Controller Catalog中的Page View Controller部分。
  • 这比编写您自己的基于滚动视图的解决方案要简单得多。如果使用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
  • 我绝对不建议使用UINavigationController,因为它会将所有先前的页面保留在内存中。
  • 关于ios - 应用程序结构:分页界面中的UIView与UIViewController,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19436580/

    10-09 07:02
    查看更多