自定义UIView和UIViewController的最佳实践?

6

我目前有一个简单的iPhone应用程序,它加载了自定义的UIView子类。目前整个应用程序只有一个控制器,尽管有几个UIView用于逻辑上的分离。

我的当前结构大致如下:

mainView : UIScrollView
    \__ has one subView : myCustomUIView : UIView
            \__ has many subSubView : myOtherCustomUIView : UIView

我希望这很清楚,冒号代表继承。
我的问题是:我需要在最低级别的subSubView中拦截事件。如果需要的话,我可能可以在应用程序控制器中执行此操作,但是我是否应该使用一个subSubViewController?我也需要一个subViewController吗?
如果需要的话,有人能指点我一些手动完成此操作的参考资料吗?当然,我可以创建这些类,但将它们连接到自定义视图似乎并不容易。除了包含窗口对象的主nib之外,我根本没有使用接口构建器。
我的主要困惑是当我有一个嵌套在具有不同控制器的视图中的视图时会发生什么。所以,假设我有一个subSubViewController,但mainView仍然有其mainViewController。由于subSubView包含在mainView中,这不会引起任何问题吗?
对于所有这些,我是否应该使用委托?任何正确方向上的提示都将不胜感激。
1个回答

10

视图和视图控制器是成对存在的。每个视图控制器控制一个视图及其子视图。这是必要的,因为视图控制器在事件响应链中。如果多个视图控制器在同一视图中活动,响应链就会变得混乱。

标准的视图控制器没有subController属性,并且不知道另一个控制器是否在同一链中处于活动状态。导航和选项卡控制器正是为了处理层级控制器而存在。但是,它们通过交换一个视图/视图控制器对来执行此操作。您不能使用导航或选项卡控制器为子视图提供不同的控制器。

因此,无论您有多少子视图,您都只能在一个屏幕上拥有一个控制器。

您可能需要重新考虑设计。如果每个子视图都需要高度可定制的行为,则可能希望将它们移动到控制器层次结构中的单独视图中,例如主细节设计模式。

如果确实需要将所有子视图放在同一屏幕上,则建议查看UITableView和UITableViewController如何处理事情。(您可能可以只使用修改后的tableview。)表格视图是一个滚动视图,用于保存多个单元格、部分标题、标头和页脚的子视图。它通过捕获tableview上的触摸并确定触摸了哪个单元格视图来管理此过程,然后采取适当的操作。

如果每个子视图都需要高度自定义的行为,则可以使用委托模式,并为每个子视图分配不同的委托对象。视图可以捕获自己的触摸事件并调用自己的委托。

滚动视图实现自定义触摸行为可能会很棘手,因为滚动视图在比其他视图更高的级别上捕获触摸,以便它可以确定是否需要滚动。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接