这里是我如何解决类似的问题:我想:
创建可重用的,独立的“微件模块班”实行从多个UIKit的组件构建一个复杂的视图(和其他嵌套小部件模块类!)。这些小部件类的高级客户类不关心UILabel是什么,小部件内部是什么UIImageView,客户只关心“显示分数”或“显示团队标识”。
一个微件模块类中,奠定了窗口小部件和联播网点UI使用界面生成器
对微件的更高水平的客户,我希望能够放置小工具的框架内在Interface Builder客户,而不必设计定制插件IB视图等
这些小窗口不是顶级控制器:所以它是没有意义对它们进行的UIViewController的子类。接下来还有苹果的建议,一次在可见屏幕上不要有多个VC。另外,还有如此多的建议和意见,比如“MVC!MVC!”,您必须将视图和控件分开!MVC!“人们强烈建议不要继承UIView子类或将应用程序逻辑放在UIView类中。
但无论如何我决定这么做(子类UIView)。我已经围绕这个区块几次了(但对于iPhone SDK/UIKit还是比较新的),并且我对设计非常敏感,这很丑陋,而且可能会导致问题,我坦率地看不出问题所在在这里继承UIView的子类。事实上,有许多优势,让您的可重复使用的小部件的UIView的一个子类,而不是进行基础的UIViewController:
你可以把在客户视图的界面构建布局Widget类的直接实例,以及当客户类从xib加载时,widget视图的UIView框架将被正确初始化。这对我来说比在客户中放置一个“占位符视图”要干净得多,然后以编程方式实例化窗口小部件模块,并将窗口小部件的框架设置为占位符框架,然后交换占位符视图以获取窗口小部件的视图。
您可以创建一个干净而简单的xib文件来在界面构建器中布置小部件的组件。 nib文件包含所有GUI布局的另一个UIView,然后在小部件的awakeFromNib:函数中,将此nib视图作为子视图添加到小部件本身。如果需要的话,任何帧大小调整都可以在这里处理,完全在小部件代码中。
小部件通过在自己的awakeFromNib方法中使用NSBundle的loadNibNamed:owner:options方法自行初始化其用户界面,因此小部件与客户类的集成是干净的:只需将UIView放入IB的客户视图中,改变的UIView的类MyWidgetView,并在客户的init或viewDidLoad中使用自己编写的窗口小部件的API设置的任何默认值在窗口小部件的显示(setScore:setTeamImage:等)
在我看来,有以这种方式创建可重用的“小部件”并使用UIViewController来划分UIView是非常非常小的区别。在这两种情况下,小部件的.h文件都充满了成员,出口,动作声明和特殊的API声明。在这两种情况下,小部件的.m文件都充满了操作实现和特殊的API实现。视图与控件分离 - 视图位于xib文件中!
因此,简言之,这是我做包装起来复杂的可重复使用的视图控件:
我有兴趣了解用于创建可重用小部件的其他结构系统,以及这种方法的优点是什么。
编辑:忘了提及,如果小部件需要将事件报告给客户类,那么只需使用委托协议,客户将小部件的委托设置为self。
谢谢zoul。虽然,我不确定该怎么做。由于applicationFrame无法考虑导航控制器等,这是否意味着我的控制器将不可避免地以错误的大小绘制其视图?我不想依靠自动修复魔法。我不相信魔法:) – DannyA 2010-09-13 19:55:42
你必须实际使用:'[[UIScreen mainScreen] applicationFrame]'@DannyA:我可以看到有些情况下自动调整大小不会理想 – Casebash 2010-09-22 07:46:11
看起来像其他UI元素知道他们所处的界限。这是怎么发生的?例如,ScrollView将内部视图精确地滚动到可见区域结束的位置,就好像它“知道”它是否在tabbar内。它如何知道? [如果我知道这是不可能的,让我知道,我会批准答案] – DannyA 2010-10-14 11:03:51