【问题标题】:Why is it incorrect to insert the view from one view controller into another?为什么将视图从一个视图控制器插入另一个视图控制器是不正确的?
【发布时间】:2012-01-22 16:56:28
【问题描述】:

在 iPad 应用程序中,我有一个包含多个视图控制器的选项卡控制器。其中一个视图控制器(称为 MainViewController)需要并排放置 2 个表视图。

所以我编写了 2 个 UITableViewController 子类,并从 MainViewController 中分配/初始化 UITableViewController 的两个子类,并将每个子类的 tableview 添加到 MainViewController 的视图中。

这意味着 UITableViewController 子类的视图是 MainViewController 视图的子视图。

这个答案:https://stackoverflow.com/a/7684648/191463 说这样做是不正确的,苹果似乎开始减少它。

我真的不想将两个 UITableViewController 中的所有代码都放在 MainViewController 中,因为如果我想在应用程序本身。

这真的是个问题吗,如果是我该怎么做呢?

【问题讨论】:

  • 观看来自WWDC 2011实现UIViewController Containment视频。

标签: iphone objective-c uiviewcontroller


【解决方案1】:

Apple 并没有削减它。这是在 iOS 5 之前创建自定义容器视图控制器的唯一方法。Apple 实际上听取了开发人员的意见,并通过子视图控制器方法和父视图控制器方法在 iOS 5 中更容易地做这种事情,更不用说他们这样做了它是分层工作的。

在大多数情况下,就应用程序崩溃或性能或任何其他方面而言,这实际上不是问题。在某些情况下这可能是个问题,因为假设您有一个子视图控制器。您将视图控制器的视图添加到您的根视图控制器。在 iOS 5 之前,子视图控制器类似于导航控制器视图控制器、标签栏控制器视图控制器和模式视图控制器。当您有一个调用[self.parentViewController dismissModalViewControllerAnimated:YES]; 的按钮时会发生什么?从技术上讲,视图控制器不是作为模态视图控制器呈现的,而是将视图添加到根视图控制器视图中。

在 iOS5 中,您可以将子视图控制器添加到视图控制器,并能够从一个子视图控制器转换到另一个。

现在,即使您的视图控制器没有不同的父级,将“根”视图控制器添加到另一个根视图控制器也不是最好的方法(尤其是因为您无法访问父级视图控制器,除非您在子视图控制器中显式创建 parentViewController 指针)。所以最后,Apple 只是让它变得更容易、更解耦。

【讨论】:

    【解决方案2】:

    只要你负责管理 viewController 生命周期事件就可以了

    initWithNibName...
    loadView:
    viewDidLoad:...
    .
    .
    viewDidUnload..
    dealloc
    memoryWarnings
    orientation changes
    

    因此,如果您创建了一个自定义的“容器视图控制器”,则您有责任在适当的时候在子视图控制器上调用所有这些方法。把它想象成“如果你要实现 UITabBarController”,关于孩子,你需要管理什么??”

    它很快变得复杂。添加另一个 viewController 的视图作为子视图是儿童游戏。

    iOS 5 通过指定父子关系为您做了一些这样的事情,但是我仍然没有看到任何示例代码指向。

    【讨论】:

      【解决方案3】:

      我想说创建视图控制器容器并没有错,尤其是当 Apple 工程师自己这样做时。 UITabBarController、UINavigationController 或 UISplitViewController - 它们都是视图控制器容器。许多具有独特 UX 的优秀应用比您想象的更普遍。然而,真正的问题是很难以正确的方式做到这一点,例如视图生命周期、内存管理和旋转处理沿着视图的层次结构正确完成。幸运的是,Apple 的人做得不错,iOS5 引入了很多关于控制器容器的功能:

      如果您对在 iOS5 之前必须如何解决上述问题感兴趣,请阅读以下两篇非常好的博文:

      【讨论】:

        猜你喜欢
        • 2014-04-24
        • 1970-01-01
        • 2023-03-11
        • 2016-09-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-18
        相关资源
        最近更新 更多