【问题标题】:UIViewController inside UIView not getting rotation delegationUIView 内的 UIViewController 没有获得旋转委托
【发布时间】:2012-06-08 00:00:07
【问题描述】:

我的 UIScrollView 子类中有一个 UIViewController 的视图。问题是当我旋转设备时,我的 UIViewController 没有调用 willRotate 委托。这可能是因为 UIView 没有在其中实现旋转委托。解决这个问题的最佳方法是什么?

基本上结构是我有一个 MainViewController,其中有一个 UIScrollView。在这个 UIScrollView 里面我有一个子视图,它是一堆 UIViewControllers 的视图。现在的问题是,当我旋转时它没有收到旋转调用。处理此问题的一种方法是将 MainViewController 委托给相应的 UIViewController。有没有更好/优雅的方法来解决这个问题?

我将它添加为来自我的 UIScrollView 而不是我的 MainViewController 的子视图,并且您不能从 UIView 执行 UIViewControllers 包含。如果我错了,请纠正我

【问题讨论】:

  • 确保MainViewController的视图.autoresizeSubviews的属性设置为YES
  • 如果您使用 iOS 5,您应该使用 childViewController API 并将所有这些视图控制器添加为滚动视图视图控制器的子级。然后,您可以免费使用旋转方法以及所有其他外观方法。
  • @Matt 是的..我知道这一点.. 但是如何添加视图控制器作为滚动视图的子视图?您不能从 UIView 添加 childViewController 对吗? UIScrollView 是 UIView 而不是 UIViewController。我猜 UIViewController 包含仅适用于 UIViewController 到 UIViewController 而不是 UIView 到 UIViewController?如果我理解错了,请纠正我
  • 如果你有开发者许可证,你可以观看这个视频:developer.apple.com/videos/wwdc/2011/?id=102 它信息量很大。基本上,您有一个视图层次结构和一个视图控制器层次结构。您想将视图控制器添加到控制器层次结构中,并将它们的视图添加到视图层次结构中。

标签: iphone objective-c ios ipad


【解决方案1】:

我认为你反对MVC pattern。视图中不能有控制器;相反,您应该有一个控制器来调解视图和用户输入之间的通信。在您的情况下,您可以将滚动视图设置为MainViewControllerself.view,然后将视图控制器视图添加为子视图。

【讨论】:

  • 好主意..但是又一次..我有一个 UIScrollView 的子类,在这个子类中我将视图控制器添加为子视图..然后我应该委托给视图控制器说当我从滚动视图添加 vc 时将其添加为子项?
  • 我可以将我拥有的 UIScrollView 子类的所有逻辑移动到我的 MainViewController 中,因为现在它的视图是 UIScrollView,但是我想在其他一些 UIViewController 中重用这个 UIScrollView
  • 我认为您不应该将 uiviewcontrollers 视图作为滚动视图的子视图,这些只是视图..您应该有一个管理所有子视图的控制器。
  • 好吧..如果我必须这样做怎么办?那么委托呢?我的意思是,如果我必须解释这一点,这是一个非常长的解释。我知道最好的方法就是将它作为视图在滚动视图中。但我真的不能
  • 是的,可以使用委托或者只是将其重新用作 UIViewController 而不是 UIView 的子类。但我没有正确理解您要解决的问题。
【解决方案2】:

观看我在评论中发布的视频:https://developer.apple.com/videos/wwdc/2011/?id=102

这里是视图控制器包含的简短摘要,这是您正在寻找的设计,而不是将您的所有逻辑组合到一个视图控制器中,或者对 SDK 中内置的东西使用委托。

视图控制器有一个视图并为该视图提供逻辑,并且很可能是其中的一些子视图。

对于该层次结构中的特定视图,您可能有一个复杂的视图层次结构和复杂的逻辑,以保证视图拥有自己的视图控制器来控制它和它的子视图。

假设你有一个 MainViewController,它的视图是一个 UIScrollView(或子类)。在该滚动视图中,您可能有各种各样的复杂视图来保证它们自己的控制器,因此您有一个类 SubViewController,它将滚动视图的子视图作为它的视图。

SubViewController 需要让旋转和外观方法回调正常工作,以便实现子视图的逻辑并处理布局更改。

    [mainViewControllerInstance addChildViewController:subViewControllerInstance];

但是,等等。子视图仍然不在视图层次结构中。

    [mainViewControllerInstance.view addSubView:subViewControllerInstance.view];

您已成功创建了两个视图控制器的有效视图控制器层次结构,并设置了它们视图的关联视图层次结构。

您现在将拥有适当的回调功能,因为 MainViewController 会将它们转发给 SubViewController。

编辑:

查看文档以了解视图控制器包含的概览:http://developer.apple.com/library/ios/#documentation/uikit/reference/UIViewController_Class/Reference/Reference.html

【讨论】:

    猜你喜欢
    • 2016-11-03
    • 2017-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多