我正在修补一个iPad应用程序(就像许多iPad应用程序一样)不使用UINavigation根视图控制系统,因此我没有对每个应用程序“视图”拥有自然所有权。我基本上有两个基本视图:文档列表视图和文档编辑视图。
我正在玩UIView动画,用于从选定的文档进入编辑视图。
我的顶部还有一个工具栏(两个“视图”中都有不同的按钮)。
因为我没有UINavigation为我运行该节目,所以我倾向于将越来越多的东西扔进一个NIB和一个拥有整个容器的视图控制器。但是现在我想弄清楚如果编辑视图存在于不同的NIB中,如何从文档列表视图转到编辑视图,同时也保留了工具栏。
任何人对此类应用结构都有想法或经验吗?我发现除了琐碎的单屏应用程序或完整的导航应用程序之外,任何关于代码/ UI结构的最佳实践缺乏文档。
根据文档,您不应该“假设”让父/子视图控制器拥有相同“屏幕”的子组件,但这意味着一个大型的鸣喇叭视图控制器基本上包含整个应用程序,并且不能是的。
不确定这是否有“正确答案”;我正在寻找一些聪明的例子或建议。几个月没有人触及过这个问题,所以我加入一笔赏金来产生良好的喋喋不休。 :)
谢谢!
UPDATE :我不是在讨论分割视图,分割视图控制器显然可以很好地处理它。相反,请查看Apple的iWork应用程序(例如Pages),它们具有文档列表视图和独立的编辑视图,但这些都与动画相关。
这里真正的问题可能是:您(或者甚至可以吗?)自己如何构建像分裂视图或导航控制器这样的“容器”视图控制器?你是否需要从零开始构建整个该死的东西?我觉得你是,因为在视图控制器之间的交互中似乎隐藏着布线。如果是这样,想一想吗?
答案 0 :(得分:3)
我认为视图控制器中唯一隐藏的布线是设置parentViewController,这是支持为拆分和导航声明的类别所必需的。
视图控制器设计为嵌套,每个控制器拥有视图层次结构的一部分。唯一的设计目标是没有视图控制器进入另一个控制器的视图层次结构。父视图控制器通常会调用添加子控制器,以便它可以在它拥有的视图层次结构中设置视图的框架。子视图控制器不应对它控制的视图的超级视图执行任何操作,因为它由另一个控制器拥有。不应该设置它控制的视图的中心或框架。
例如,导航控制器具有push方法,在该方法中,它删除先前的控制器视图,添加新的控制器视图,并设置新添加的视图的框架。通常,父视图控制器可以自由设置子控制器视图的帧,但不能设置边界。
如果你想改变导航控制器的动画,我想你会先用一个动画:参数实现每个方法。设置动画,然后在提交动画之前调用super动画标志。
答案 1 :(得分:2)
我没有在UIKit提供的那些(导航/标签栏/模态/等)之外尝试多视图控制器的东西,但我不明白为什么它不应该工作。在引擎盖下,一切都是视图,虽然我会注意到UIKit对视图控制器有特殊的视图,毫无疑问它有一些特殊的系统处理(UIViewController有一个包装器视图,UINavigationController有一个UINavigationTransitionView或者什么,... )。
我建议不要过多担心“最佳实践” - 只需编写符合你想要的东西。有两种选择:
另请注意,您可以将多个笔尖加载到同一个视图控制器中,例如:将它连接到一个名为editView的插座。最大的区别是它不是由[ - UIViewController loadView]自动完成的,所以你需要做类似的事情
-(EditView*)editView {
if (!editView) {
// Loads EditView into the outlet editView
[NSBundle loadNibNamed:@"EditView" owner:self];
}
return editView;
}
您还需要担心将其添加到视图层次结构中,卸载它 - (void)viewDidUnload(iPhone OS 3.0+),将其设置为 - (void)viewDidLoad以防万一期间出现内存警告编辑模式等...
这并不容易,但用户界面永远不会。
答案 2 :(得分:1)
您需要使用拆分视图/弹出窗口视图实现的主 - 详细信息视图,并使用UISplitViewController进行控制。
主视图是文档列表,详细视图是编辑视图。每个都有自己的控制器。这两个控制器本身由UISplitViewController管理。
如果你不使用splitview控制器,你最终会手工编写与它非常相似的东西。这实际上是在API中轻松完成您想要的任务的唯一方法,它是iPad用户期望的布局。
有关详细信息,请参阅iPad编程指南中的Creating a Split View Interface。