简化复杂的Cocoa-Touch视图控制器

简化复杂的Cocoa-Touch视图控制器,cocoa,cocoa-touch,design-patterns,oop,uiviewcontroller,Cocoa,Cocoa Touch,Design Patterns,Oop,Uiviewcontroller,当我连接起我的第一个相当复杂的Cocoa Touch视图时,我觉得我无意中又回到了旧的程序模式中,发现很难摆脱它们……尽管我完全了解许多Cocoa(OO)设计模式,但我担心我可能正在颠覆它们 正因为如此,这种观点很快变得难以管理,我想知道我是否用了错误的方式来处理它?!?视图由UIViewController的子类管理。视图本身包含±10个子视图。其中一些子视图“滑入”和“滑出”,并包含随它们一起滑入的自己的子视图(控件、图像视图等) 在没有太多细节的情况下,我发现我正在根视图控制器的touch

当我连接起我的第一个相当复杂的Cocoa Touch视图时,我觉得我无意中又回到了旧的程序模式中,发现很难摆脱它们……尽管我完全了解许多Cocoa(OO)设计模式,但我担心我可能正在颠覆它们

正因为如此,这种观点很快变得难以管理,我想知道我是否用了错误的方式来处理它?!?视图由UIViewController的子类管理。视图本身包含±10个子视图。其中一些子视图“滑入”和“滑出”,并包含随它们一起滑入的自己的子视图(控件、图像视图等)

在没有太多细节的情况下,我发现我正在根视图控制器的touchsbegind/Moved/end方法中执行管理代码的大部分(如果不是全部的话,包括动画)。而且管理、设置和检查布尔属性变得一团糟。如果(编辑模式和面板可用)。。。。如果(编辑模式和面板可视)。。。或者*if(viewFlipped){for(someArrayOfSubviews中的MyCustomView视图)}等等。。。当然,此应用程序的UI要求用户触摸这些视图(或其内容)并将其移动到屏幕的不同部分

我试图解决的主要问题似乎是:如果存在viewA,则3个视图将隐藏(动画)…或者,如果触摸viewB,则viewC中包含的所有对象都是负数。。。等等


有没有聪明的(或基本的)OO方法来处理这个问题?也许让包含视图的子视图充当它们自己的迷你视图控制器?我还没有找到太多(任何?)这样的例子,不过…

我认为你应该按照你最后的建议,让包含视图的子视图充当它们自己的迷你视图控制器。每个显示“满屏内容”的(子)视图可以/应该由其自己的视图控制器管理

可以使用内置导航控制器(您实际上可以隐藏导航控制器的顶部栏)在这些视图之间设置动画,这样您就拥有了默认的幻灯片动画。否则,您确实可以在仍然使用导航控制器的情况下创建自己的动画

“视图本身包含±10个子视图”。其中一些子视图“滑入”和“滑出[…]”。您正在讨论的这些子视图是从单一UIView中提取的完美候选视图

使用的基本OO原则是导航控制器如何做到这一点,方法是在堆栈上或堆栈上弹出视图。推送和弹出的每个视图都由其自己的视图控制器处理


编辑:我现在明白了,你并不是专门谈论iPhone的开发。不过,看看它是如何在那里完成的(尤其是UINavigationController)。您仍然可以获得基本的设计思想

,正如您在问题末尾所建议的,我建议您在需要特定子视图的逻辑时使用子视图。控制器对象的要点是跟踪视图的状态,并封装您所描述的所有视图逻辑。界面操作,例如用户是否可以移动到其他屏幕、是否可以调用保存逻辑、是否可以创建新文档,都应该在该特定视图的控制器中。这将有助于在不同控制器之间保持关注点的分离,并在顶层减少复杂的逻辑


虽然这本书并不专门涉及iPhone编程,但它包含了在应用程序中使用子程序和子视图的好例子(特别是在关于如何使用首选项窗口的章节中)。

也许我应该更清楚一些。是的,这是iPhone的。而且,这些子视图并不是一个完整的“满屏内容”。它们可能是1/6屏幕“面板”,触摸时可滑入,以提供额外的控件/视图。所以不要认为他们是一个完整的导航控制器。一个导航控制器可能对你来说太多了。不过,您可以为子视图创建单独的视图控制器。嘿!我有Hillegass的书。我会复习你提到的那一章,然后向你汇报。。。