2

我知道我可能会因为没有正确阅读HIG或某些文档而遭到批评,但是经过几次培训视频并在iPhone上构建了一些小型项目之后,我现在试图将所有东西放在一起iPad,以及我的大脑伤害。如何将iPad视图分解为更易于管理的块?

我明白了iPhone上的想法,即一个视图=一个屏幕和一个视图=一个视图控制器。但是现在我正在处理可以同时显示多个事物的硬件,我不太了解我应该如何使用它。

我给出的例子是当前的项目...我为不同的屏幕内容(闪屏,​​菜单,文章视图等)组合了一堆不同的视图控制器。但随后一些屏幕共享内容。例如,菜单和文章屏幕都有一个菜单栏(如工具栏),从屏幕顶部向下滑动并提供导航。此外,我有一个导航元素,应该从屏幕底部向上滑动以导航到不同的文章。这些是我在许多其他iPad应用程序中看到的(Wired是一个示例)。

但我不应该在屏幕上一次放置多个视图控制器,是吗?不仅如此,但如果我这样做,自动旋转功能开始有点精神。但是如果我把所有东西都放到一个视图控制器中,我最终会得到1000行代码,其中大部分代码都需要复制粘贴到其他视图控制器中。对我来说,这似乎是一个非常丑陋的解决方案。

所以我很明显做错了什么......但我该怎么做?即使有人可以请我指出我应该阅读的信息的方向,我会非常感激。

谢谢!

:-Joe

回答

2

您没有禁止显示的时间,其中视图控制器是一个以上的视图只查看经理驻留是存储器。

您可以创建一个自定义视图控制器来管理您的视图控制器。把它想象成UINavigationController或者UISplitViewController。

你有viewControllers

@property (nonatomic, retain) NSMutableArray *viewController; 

/* 
Do not use this code in production, its just for the example 
*/ 
- (void)presentViewController:(UIViewController *)controller inRect:(CGRect)rect { 

    // check if viewcontroller is valid object 
    if (controller == nil) { 
     return; 
    } 

    // retain the controller 
    [self.viewController addObject:controller]; 

    // position controllers view in the desired rect 
    // (in your implementation you might create a zones and use them instead) 
    controller.view.frame = rect; 

    // you might want to provide some animation capabilities here 
    [self.view addSubview:controller.view]; 
} 

现在,因为你需要,你可以在屏幕上用自己的视图控制器许多意见的一个NSMutableArray。你可能有嵌套的视图控制器,例如: ViewControllerManager-> NavigationController - > [ViewControllers];

P.S.当然,完整的实现将更加复杂,您需要调用viewcontrollers viewWill/viewDid,管理viewcontroller视图动画(呈现和解散),lowMemoryWarning上的内存管理(清除不可见或未使用的视图控制器)等等。

希望能有所帮助。 :)

+0

嗨,感谢您的建议......你提供的代码应该在UIViewController本身吗?我发现,如果我在任何时候在iPad上的屏幕上有多个自定义UIViewController,那么我会得到零星的结果,例如自动旋转无法正常工作。但是,我发现自从我可以使用UINavigationController来完成很多腿部工作... – jowie 2011-01-06 22:59:07

+0

对不起,我迟到了。是的,它应该在您的自定义根视图控制器中,您将从哪里管理所有子视图控制器。我也使用UINavigationController作为我的根控制器,因为你遇到过同样的问题。我的结构是:UIWindow-> UINavigationController(HIDDEN) - > MyRootViewController - > [menuControllers,headerControllers,baseControllers]; – ludesign 2011-01-28 01:06:06

1

我认为你缺少的是你可以混淆哪些不是UIViewControllers。你很对,UIKit希望你一次只显示一个UIViewController(Apple的容器视图控制器除外)。然而,单个视图控制器可以管理许多视图的层次结构,每个视图都可能有一个控制器对象来管理它们的一些行为。然后,您可以在多个视图控制器中重复使用这些控制器或自定义视图

+0

这很有趣,但是当你说“每一个都可能有一个控制器对象”时,这些控制器对象会如何体现出来? – jowie 2011-01-06 23:00:02

+0

就像UIViewController是一个具有'view'属性的类,你可以创建你自己的控制器类,它具有对视图的引用,充当它们的视图委托,并且通常填充相同的控制器角色。所以在你的情况下,导航元素可能是一个充满按钮的自定义视图,这些按钮可能会调用一些负责管理导航界面的自定义控制器类上的IBAction方法。这样你就没有一切与单个UIViewController交谈,你可以创建一个自定义导航控制器的实例并在需要的地方查看。 – Jonah 2011-01-07 05:07:56