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

时间:2010-07-21 14:15:25

标签: iphone cocoa-touch uiview uiviewcontroller

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

我目前的结构看起来像这样:

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

我希望这很清楚;当然,冒号代表了遗产。

我的问题是:我需要拦截最低级别的事件subSubView。如果需要,我可以在应用程序控制器中执行此操作,但是我应该使用subSubViewController吗?我也应该有一个subViewController吗?

如果是这样,有人可以指点我参考手工做这个吗?我当然可以创建类,但将它们连接到自定义视图似乎并不重要。除了保存窗口对象的主笔尖之外,我根本不使用接口构建器。

我的主要困惑来自于当我将视图嵌套在具有不同控制器的视图中时会发生什么。所以我想说我确实有一个subSubViewController,但是mainView仍然有它的mainViewController。由于subSubView包含在mainView中,这不会引起一些问题吗?

我是否应该使用代表呢?

任何朝着正确方向的推动都会受到赞赏。

1 个答案:

答案 0 :(得分:10)

视图和视图控制器成对存在。每个视图控制器控制视图和视图的子视图。这是必要的,因为视图控制器位于事件的响应器链中。如果多个视图控制器在同一视图中处于活动状态,则响应者链将变为扰乱。

标准视图控制器没有subController属性,并且不理解另一个控制器是否在同一个链中处于活动状态。导航和tabbar控制器精确地存在以处理分层控制器。但是,他们通过将一个视图/视图 - 控制器对交换为另一个来实现。您不能使用导航或tabbar控制器为子视图提供不同的控制器。

因此,无论您有多少个子视图供您查看,您最终每个屏幕只有一个控制器。

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

如果你必须在同一个屏幕上拥有所有子视图,那么我建议看一下UITableView和UITableViewController如何处理事情。 (您可能只能使用修改后的tableview。)tableview是一个scrollview,它包含单元格,节标题,页眉和页脚的多个子视图。它通过捕获tableview中的触摸并确定触摸了哪个单元格视图然后采取适当的操作来管理它。

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

Scrollviews可能很难实现自定义触摸行为,因为scrollview陷阱触摸的级别高于其他视图,因此它可以确定是否需要滚动。