【问题标题】:view management in iOSiOS 中的视图管理
【发布时间】:2011-02-02 02:31:30
【问题描述】:

我已经创建了几个 iPhone 和 iPad 应用程序,但我使用另一个支持 api 或使用开源库(如 Cocos2d 支持场景管理和屏幕转换)编写了它们。我觉得我还没有完全弄清楚在没有这些外部 API 的情况下如何应该完成屏幕/场景/视图管理。有人可以非常简单但清楚地解释应用如何管理屏幕转换和/或向我指出一个很好的参考,以尽可能少地展示这一点吗?

我是否应该使用 UIViewController 派生类来分隔我的应用程序的逐屏功能(除了已经用于处理导航控制器等多屏操作的功能)?我的应用程序是否会本质上将控制权交给这些视图控制器之一,然后它会使用其组件(如标签、按钮、任何视图)构建我的场景。如何切换到相关的视图控制器,我是否应该期望 loadView 被调用?然后,当一些触发器调用移动到屏幕 B 时,是否会调用“转出”我的视图,然后调用其他一些视图控制器来“设置您的视图”并将它们转入?

如果有一个示例程序可以真正说明这一点,最好没有界面生成器,那将是理想的。

【问题讨论】:

    标签: ios view controller


    【解决方案1】:

    我应该使用 UIViewController 派生类 逐屏分离 我的应用的功能?

    是的。

    我的应用程序本质上会是手吗 控制到这些视图之一 然后将构造的控制器 我的场景及其组件?

    是的,尽管许多 VC 只是从 nib 获取视图树,并关注核心控制器职责: 1. 将模型更改传播到各个视图字段; 2. 将视图事件传播回模型上的适当操作。我建议掌握 InterfaceBuilder 的窍门。它不完美且令人讨厌,但它可以为您节省数小时的工作和大量代码。

    如何切换到相关的视图控制器?

    多种方式:

    • 如果您的 VC 托管在导航控制器中,[[self navigationController] pushViewController:theNextVC animated:YES] 是一个常见的习惯用法。
    • 在一组没有明确层次结构的 VC 之间切换,最好使用 UITabBarController
    • 如果你想做模态堆叠,[self presentModalViewController:theNextVC animated:YES] 是怎么做的。但是,比一两个更深的模态堆栈变得笨拙。
    • 在 4.x 中通过将其分配给窗口的 rootViewController 属性(应用程序委托可以执行此操作,或主 nib 可以执行此操作)来完成第一个 VC 的呈现;或者对于 pre-4,通常在应用程序委托中找到的传统方式:[myMainWindow addSubview:[myInitialVC view]]
    • 一些专门的苹果提供的 VC(视频、照片选择器)有自己的演示方法。

    请注意,对于前两种方法,如果您想要行为而不是 UI 小部件,您可以隐藏导航栏或标签栏并以编程方式执行所有操作。

    我应该期望 loadView 被调用吗?

    它会的,但你的大部分“我现在出现了!”逻辑属于viewWillAppear:(在过渡动画开始之前调用,当视图还没有父视图时)和viewDidAppear:(在动画之后调用,当视图完全可见时。)loadView在你的VC认为时调用一次很快就会需要该视图,并且不会再次调用该视图,除非内存不足的情况转储了该视图并需要重新创建。

    当您想用其他视图树构造方法完全替换 nib 加载时,覆盖 loadView。我开始这样做了,但现在很少这样做了。

    覆盖viewDidLoad 当你仍然希望正常的笔尖加载发生,但也想自己做一些视图树构造/后处理。这就是我发现自己 99% 的时间都在做的事情。

    当一些触发器调用移动到屏幕 B 时,是否会调用“转出”我的视图,然后调用其他一些视图控制器来“设置您的视图”并将它们转入?

    如果您使用前面列出的任何一种演示方法,就会发生转换。您需要做的就是实现 viewWill/DidAppear 和朋友,以便在它发生时得到通知。

    您可能希望调查“TheElements”示例项目(在 xcode 文档中搜索“元素”)根据要求,它不使用 nib;它以艰难的方式在代码中设置所有内容。它有很好的使用 TabBarController 和 NavigationController 的示例,并以或多或少推荐的方式在 VC 之间划分职责。

    【讨论】:

    • 哇,好多话。随意将其编辑为您认为有帮助的部分(如果有的话)。
    • 听起来如果我想要一个通用的解决方案,标签栏控制器可能就是我正在寻找的,但是在这个类中我在哪里可以找到它如何处理转换?如果我将 selectedViewController 属性设置为从一个屏幕切换到另一个屏幕,转换会发生在哪里?此外,如果我想定制我的过渡(比如让每个小部件都有自己的退出),我是否必须在更改控制器时触发这些动画,或者等到退出动画结束时才触发控制器更改。如果是前者,我需要延迟我的新屏幕的入口动画吗?
    • 另一个问题是为什么我首先需要一个标签栏控制器?它是否具有一些简化转换的内置功能?为什么我不将controllerA.view 添加到我的窗口,然后当我想要下一个屏幕时,删除该视图并添加controllerB.view?在我的情况下,标签栏对旧的过渡和新的延迟过渡是否有一些处理?
    • 标签栏控制器不提供其标签之间的过渡动​​画,遗憾的是。 (至少公开!苹果为自己保留了一些好东西。)如果你想要花哨的过渡,那么第二条评论中的方法是正确的:在主窗口内外交换视图。这就是 appDelegate 在更简单的应用程序中所扮演的角色;您可能想制作某种您自己设计的“元控制器”(不是 UIViewController 子类),它具有 UIViewController 数组,并根据要求在窗口上设置转换并交换视图。
    • 很高兴知道。我发布了一个单独的后续问题,询问我处理过渡动画的方法是否合理。将其作为单独的帖子似乎很有意义。可以在这里找到:stackoverflow.com/questions/4882897/…
    【解决方案2】:

    您的基本控制器有 2 个基本选项,即 UITabBarController 或 UINavigationController。 (您可以将 UINavigationController 放在 UITabBarController 中,但不能反过来)。

    如果你有一个 UITabBarController,最简单的做法是为每个选项卡分配不同的视图控制器(UIViewController 子类)。 UITabBarController 将处理它们之间的转换并调用 viewWillAppear 等方法。

    使用 UINavigationController,您可以设置 rootViewController。然后该视图控制器负责调用[self.navigationController pushViewController:animated:]。这通常通过 UITableViewController 完成。 UINavigationController 将调用 viewWillAppear 等方法。

    呈现视图控制器的最后一个选项是以模态方式呈现它。那是一个屏幕弹出来填满屏幕的地方。您可以将其设置为从底部升起、翻转或淡入。为此,请创建您的视图控制器并调用 -[UIViewController presentModalViewController:animated:]

    除此之外,大多数视图控制器一次在屏幕上显示一个(iPad 除外)。使用子类 UITableView 和 UIScrollView 或者只是 UITableView。每个视图控制器都应该独立于它的容器。这意味着您可以在 UINavigationController 上推送相同的视图控制器或将其设置为 UITabBarController 上的选项卡或以模态方式呈现。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多