Ios4 UIScrollView中的UIViewController:我没有正确理解什么?

Ios4 UIScrollView中的UIViewController:我没有正确理解什么?,ios4,xcode4,uiviewcontroller,uiscrollview,addsubview,Ios4,Xcode4,Uiviewcontroller,Uiscrollview,Addsubview,我将首先说明我在应用程序中尝试做什么: 我正试图构建一个文档“选取器”屏幕,类似于iPad上的页面或数字,看起来像这样: 我想要一个UIScrollView,我可以在其中放置子视图;这些子视图上可能有控件,比如页面/数字中的日期/名称“排序”分段控件,或者它们可能是文档的图像。子视图显示的内容并不重要-我希望子视图是支持UIViewControllers的视图。这就是我困惑的开始 请参阅,我最初尝试使用UITableView构建文档选择器屏幕。由于各种原因,超出了这个问题的范围,这个问题没有解

我将首先说明我在应用程序中尝试做什么:

我正试图构建一个文档“选取器”屏幕,类似于iPad上的页面或数字,看起来像这样:

我想要一个
UIScrollView
,我可以在其中放置子视图;这些子视图上可能有控件,比如页面/数字中的日期/名称“排序”分段控件,或者它们可能是文档的图像。子视图显示的内容并不重要-我希望子视图是支持
UIViewControllers
的视图。这就是我困惑的开始

请参阅,我最初尝试使用
UITableView
构建文档选择器屏幕。由于各种原因,超出了这个问题的范围,这个问题没有解决。作为这项工作的一部分,我创建了
UITableViewCell
子类(以及附带的XIB),如所示。我对自己说,这太棒了-我可以在
UITableView
中显示视图,并且有一种方法可以从这些视图中获取事件,方法如下(
sortTypeChanged
响应我的日期/名称分段控件中的选择更改):

这一切都很好,直到我意识到
UITableView
无法满足我的需求。所以我放弃了它,选择了
UIScrollVIew
。然而,这正是我目前所知不足的地方。自定义
UITableViewCells
的“使用视图控制器/XIB视图”范例似乎不适用于
UIScrollView

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

然而,让我担心的是,我似乎从根本上误解了视图控制器/视图是如何工作的。尤其是与
UIScrollView
结合使用时

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

编辑:我应该补充一点,我的问题在于我是从WPF的角度来看待这个问题的,在WPF中,使用MVVM模式,您可以通过组合较小的视图来构建完整视图,每个视图都有自己的背景视图模型。在iOS中复制这一点现实吗?还是不建议使用它?

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


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

谢谢-答案中的视图控制器部分会有所帮助,但XIB部分会提出更多问题。谁对在XIBs中定义的视图上发生的操作作出响应?父视图的视图控制器?如何将这些操作连接到视图控制器?这可以通过interface builder完成吗?@unorgiven3:操作会传递到IB中连接到的任何对象。这通常是所有者对象,但没有什么可以阻止您将操作连接到xib中具有适当操作方法的任何其他对象。为此,您还可以使用UIControl的方法连接代码中的操作。
@interface DocSortViewController : UITableViewCell {
}

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