我将通过陈述我在我的应用中尝试做的事情来开始我的问题:
我正在尝试构建一个文档“选择器”屏幕,类似于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中复制它是否现实?或者它是不是真的推荐?
答案 0 :(得分:2)
在iOS中,“视图控制器”是一个特殊实体,通常控制整个屏幕的子视图(iPad上的UISplitViewController和UIPopoverController是例外)。您链接的教程告诉您为UITableViewCells创建视图控制器xib是错误的。你应该做的是为你的UITableViewCell子类创建一个xib,不涉及任何视图控制器。乍一看,其余部分似乎或多或少都是正确的。
你可以用UIScrollView做同样的事情,除了你没有方便的tableView:cellForRowAtIndexPath:
方法来告诉你何时从xib创建子视图。如果没有你发布的实际错误,当它“崩溃”时我会猜到,但我猜你提供的任何对象instantiateWithOwner:options:
的所有者与nib所期望的不匹配。作为所有者传递的对象必须是所有者在nib中指定所有类的实例。