UIScrollViews 中的 UIViewControllers:我没有正确理解啥?

Posted

技术标签:

【中文标题】UIScrollViews 中的 UIViewControllers:我没有正确理解啥?【英文标题】:UIViewControllers within UIScrollViews: what am I not understanding correctly?UIScrollViews 中的 UIViewControllers:我没有正确理解什么? 【发布时间】:2011-08-19 01:58:45 【问题描述】:

我将通过说明我想在我的应用中做什么来开始我的问题:

我正在尝试构建一个文档“选择器”屏幕,类似于 iPad 上的 Pages 或 Numbers,看起来像这样:

我想要一个UIScrollView,我将子视图放入其中;这些子视图上可能有控件,例如 Pages/Numbers 中的日期/名称“排序”分段控件,或者它们可能是文档的图像。子视图显示什么并不重要——我希望子视图是支持UIViewControllers 的视图。这就是我的困惑开始的地方。

看,我最初尝试使用UITableView 构建我的文档选择器屏幕。由于超出此问题范围的各种原因,这没有解决。作为这项工作的一部分,我按照this tutorial (Creating a custom UITableViewCell in ios 4) 创建了UITableViewCell 子类(以及随附的XIB)。我心想,这太棒了 - 我有可以在 UITableView 中显示的视图,并且有办法从这些视图中获取事件,例如(sortTypeChanged 响应我的选择更改)日期/名称分段控件):

@interface DocSortViewController : UITableViewCell 


-(IBAction)sortTypeChanged:(id)sender;
@end

这一切都很好 - 直到我意识到 UITableView 不会得到我想要的东西。所以我放弃了它,转而支持UIScrollVIew。然而,这是我目前的知识让我失望的地方。自定义UITableViewCells“使用视图控制器/XIB 视图” 范式似乎不适用于UIScrollViews

我不知道如何创建一个单独的视图控制器和随附的 XIB,我可以在我的 UIScrollView 中加载和显示它们。尝试通过 UINib.instantiateWithOwner 加载 XIB 并将视图控制器的 view 属性添加为子视图崩溃。我不知道为什么。

不过,我担心的是,我似乎从根本上误解了视图控制器/视图的工作原理。尤其是与UIScrollViews结合时。

我错过了什么?有没有人试图做类似的事情?是否有推荐的最佳实践?如果您不应该将视图控制器/XIB 加载到UIScrollViews,那么您应该怎么做?您如何从位于UIScrollView 中的子视图的控件中获取事件?

编辑:我应该补充一点,我的问题的一部分是我通过 WPF 的镜头来看待这个问题,在这种情况下,使用 MVVM 模式,您可以通过编写来构建一个完整的视图它具有较小的视图,每个视图都有自己的支持视图模型。在 iOS 中复制它是否现实?还是真的不推荐?

【问题讨论】:

【参考方案1】:

在 iOS 中,“视图控制器”是一个特殊的实体,通常控制整个屏幕的子视图(iPad 上的 UISplitViewController 和 UIPopoverController 除外)。您链接的教程告诉您为 UITableViewCells 创建视图控制器 xib 是错误的。你应该做的是为你的 UITableViewCell 子类创建一个 xib,不涉及视图控制器。乍一看,其余部分似乎或多或少是正确的。

你可以用 UIScrollView 做同样的事情,除了你没有方便的tableView:cellForRowAtIndexPath: 方法告诉你何时从 xib 创建子视图。如果没有您发布“崩溃”时您得到的实际错误,我只能猜测,但我猜您作为 instantiateWithOwner:options: 的所有者提供的任何对象都与 nib 的期望不匹配。作为所有者传递的对象必须是在 nib 中指定所有者的任何类的实例。

【讨论】:

谢谢 - 您的答案的视图控制器部分有所帮助,但 XIB 部分提出了更多问题。谁来响应在 XIB 中定义的视图上发生的操作?父视图的视图控制器?你如何将这些动作连接到视图控制器?可以通过界面生成器完成吗? @unorgiven3:动作被传递到它们在 IB 中连接的任何地方。这通常是 Owner 对象,但没有什么能阻止您将操作连接到 xib 中具有适当操作方法的任何其他对象。就此而言,您还可以使用 UIControl 的 addTarget:action:forControlEvents: 方法在代码中连接操作。

以上是关于UIScrollViews 中的 UIViewControllers:我没有正确理解啥?的主要内容,如果未能解决你的问题,请参考以下文章

处理嵌套 UIScrollViews 中的冲突手势

UIScrollViews 和动态创建页面

iOS 嵌套 UIScrollViews 使用 AutoLayout

Xcode 4.2.1 UIScrollViews不在故事板中滚动

带有 UIScrollViews 的 iCarousel

具有水平滚动的嵌套 UIScrollViews