关于何时使用 UIViewContoller 与 UIView,有一些很好的答案。例如here和 here .
一般要点是应该使用 UIVIewController 来控制全屏数据,因为
它旨在处理旋转。因为 only the newest 一次屏幕上应该只有一个 UIViewController将收到轮换发生的通知。
为了忠于 MVC 范例,您的业务逻辑应该存在于 UIViewController 中,而只有显示和交互逻辑应该存在于 UIView 中。大概业务逻辑与整个屏幕上的内容有关。
我的问题是,鉴于此,我如何构建一个在多个顶级 View 之间进行左右分页的应用程序?
我想创建一个包含多个 UITableView 的界面,其中包含一个食谱列表。用户左右滑动以在列表之间导航。底部有一个通用菜单,无论如何都会保持不变。
我最初的想法是为 UIScrollView 使用一个 UIVIewController,然后从那里添加 subview 。
不过,我真的很希望每个列表都有自己的 UIViewController,这样它就可以处理自己的旋转,并像拥有自己的 REST 方法一样保留业务逻辑。让顶级 UIViewController 处理 subview 的旋转似乎很痛苦,将逻辑放在其他地方似乎违反了 MVC。
有没有办法构造一个应用程序,让多个 UIViewControllers 住在一个 UIScrollView 中,或者使用一系列顶级 UIViewControllers 和 UISwipeGestureRecognizer 来模拟 UIScrollView 的分页效果是否合适?
谢谢。
最佳答案
几个想法:
如果针对 iOS 5 及更高版本,我建议使用专为该 UI 设计的
UIPageViewController
(在UIViewController
实例之间来回滑动)。然后,您将为每个食谱创建一个单独的UIViewController
。在 iOS 5 中,你只有UIPageViewControllerTransitionStylePageCurl
transition style ,但在 iOS 6 中,你还有UIPageViewControllerTransitionStyleScroll
。有关详细信息,请参阅iOS View Controller 目录的 Page View Controller 部分。
这比编写您自己的基于 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。
不过,我绝对不会推荐使用
UINavigationController
,因为它会将之前的所有页面保存在内存中。
关于ios - App结构 : UIView vs. 分页界面中的UIViewController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19436580/