ios - App结构 : UIView vs. 分页界面中的UIViewController

标签 ios objective-c cocoa-touch uiviewcontroller uikit

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

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

  1. 它旨在处理旋转。因为 only the newest 一次屏幕上应该只有一个 UIViewController将收到轮换发生的通知。

  2. 为了忠于 MVC 范例,您的业务逻辑应该存在于 UIViewController 中,而只有显示和交互逻辑应该存在于 UIView 中。大概业务逻辑与整个屏幕上的内容有关。

我的问题是,鉴于此,我如何构建一个在多个顶级 View 之间进行左右分页的应用程序?

我想创建一个包含多个 UITableView 的界面,其中包含一个食谱列表。用户左右滑动以在列表之间导航。底部有一个通用菜单,无论如何都会保持不变。

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

不过,我真的很希望每个列表都有自己的 UIViewController,这样它就可以处理自己的旋转,并像拥有自己的 REST 方法一样保留业务逻辑。让顶级 UIViewController 处理 subview 的旋转似乎很痛苦,将逻辑放在其他地方似乎违反了 MVC。

有没有办法构造一个应用程序,让多个 UIViewControllers 住在一个 UIScrollView 中,或者使用一系列顶级 UIViewControllers 和 UISwipeGestureRecognizer 来模拟 UIScrollView 的分页效果是否合适?

谢谢。

最佳答案

几个想法:

  1. 如果针对 iOS 5 及更高版本,我建议使用专为该 UI 设计的 UIPageViewController(在 UIViewController 实例之间来回滑动)。然后,您将为每个食谱创建一个单独的 UIViewController。在 iOS 5 中,你只有 UIPageViewControllerTransitionStylePageCurl transition style ,但在 iOS 6 中,你还有 UIPageViewControllerTransitionStyleScroll

    有关详细信息,请参阅iOS View Controller 目录的 Page View Controller 部分。

  2. 这比编写您自己的基于 ScrollView 的解决方案要简单得多。如果您使用 UIScrollView“滚动自己的”,您将希望删除已滚动到屏幕外的实例(通过注册为 ScrollView 的 delegate 并响应 scrollViewDidScroll )所以你不会不必要地耗尽内存。

    如果您确实将 subview Controller 添加到 ScrollView ,请不要忘记调用适当的 custom container calls 。具体来说,当您将 View Controller 添加到 ScrollView 时,请确保调用以下命令(假设 controller 是子 Controller 而 self 是主视图 Controller ):

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

    当您响应 scrollViewDidScroll 以删除不再可见的 View Controller 时,执行适当的删除调用,例如:

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

    有关调用这些自定义容器调用的重要性的信息,请参阅 WWDC 2011 视频 Implementing UIViewController Containment

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

关于ios - App结构 : UIView vs. 分页界面中的UIViewController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19436580/

相关文章:

ios - 如何以编程方式在 View 之间转换?

ios - 使用 AssetsLibrary 框架 iPhone 访问库中的视频?

objective-c - 如何使用 ParseKit 过滤掉不需要的标记?

iphone - 释放内存分配的正确方法?

iphone - 类似于 Windows 桌面中的矩形选择

ios - 如何使用完成处理程序方法运行 for 循环?

ios - 将数据从自定义表格 View 单元格获取到另一个 VC?

iphone - 在哪里放置 SSL 证书

objective-c - 如何将 CALayer 的内容设置为 CGImageRef?

iphone - 如何使用 Sharekit 检索 Twitter 用户名