嵌入式UIScrollView未加载其子视图

时间:2013-04-10 00:59:27

标签: ios uiscrollview instantiation

我在这里可能有一个奇怪的VC结构,我只是有点陌生​​,导致它破坏

UIViewController(contains->)UIContainerView(embeds - >)UIScrollView(包含 - >)UIView

我有最终的UIView因为我无法弄清楚如何使scrollview遵守特定的大小限制所以我只是添加了一个“内容视图”。

问题是,现在“内容视图”数据未加载

内容视图的日志是:

<UIView: 0x81cd510; frame = (-306 0; 612 792); autoresize = TM+BM; layer = <CALayer: 0x81c2000>>

Scrollview的日志是

<UIScrollView: 0x81e5e90; frame = (0 0; 0 0); clipsToBounds = YES; opaque = NO; autoresize = W+H; gestureRecognizers = <NSArray: 0x81e67b0>; layer = <CALayer: 0x81e6060>; contentOffset: {0, 0}>

所以它似乎没有加载......是什么给出的?如何让它加载?

编辑以澄清:

  • 所有这些观点都是通过IB
  • 创建的
  • 不使用AutoLayouts(虽然听起来很有趣)
  • NSLog方法在视图层次结构链顶部的viewcontroller中的ViewDidAppear中调用。 (也许这就是问题?)

编辑:将项目上传到github,以便人们可以采取外观 https://github.com/Pinwheeler/ChiroMatic.git

1 个答案:

答案 0 :(得分:2)

我花了很多时间来完成你的项目,令人沮丧的是,我无法推断导致问题的原因。但我发现我能够通过重新创建PrintViewControllerPrintContentViewController场景来解决问题(我必须重新创建两个场景以解决问题)。我创建了一个项目的分支并修复了两个场景。我试图在源代码和git存储库提交注释中注释我的更改,所以希望你可以按照我改变的方式。我的分叉位于:

(当你要我删除那个回购时,请告诉我。我很乐意随时删除它,因为我认为你不希望我无限期地在github上留下一份副本。)

有几点意见:

  1. 你说你没有使用autolayout,但你确实如此。 (转到故事板上的第一个Document Inspector标签,您将看到&#34;使用Autolayout&#34;已经过检查。)如果您想使用它,那就没问题了(&# 39;现在是Xcode中的默认设置)但是如果您使用它,则预先警告您将丢失iOS 6之前的iOS版本的向后兼容性。 Autolayout很强大,但是当你第一次开始使用它时可能会很棘手。这是你的电话。

  2. PrintContentViewController中,我最重要的变化是使用标准视图控制器场景配置(顶级视图为UIView),然后我创建了UIScrollView这是一个子视图。话虽如此,我认为您不需要UIView的{​​{1}}子视图(如果您有中间{{1},则会丢失一些滚动视图功能,这会有问题}}),所以我删除了它,并制作了滚动视图本身的所有标签和类似的子视图。

  3. 您在整个地方都使用了容器视图,但令我感到震惊的是您增加了一定程度的复杂性,这是不必要的。 (顺便说一下,如果你没有使用这些容器视图,你原来的问题就不会出现问题。)

    当您想要从其子视图控制器中抽象出与容器视图控制器关联的逻辑时,自定义容器非常有用。但你不是在这里做的。更糟糕的是,您正在经历各种旋转以获取子控制器的UIScrollView引用并更新容器控制器中的属性。我衷心鼓励您重新考虑使用这些容器视图,并完全从项目中删除它们。

    如果您对容器视图有迫切的需求,请使用它们(我喜欢它们并且一直使用它们),但我在这里看不到任何需要,而且您正在制作生活对你自己来说复杂得多。

    另外,顺便说一下,embed segue的使用仅限iOS 6功能,如果您需要iOS 5向后兼容性,这可能是一个问题。

  4. 最重要的是,在创建新项目和镜像故事板时,我始终无法重现您的问题。我也无法通过对旧UIViewIBOutlet场景的任何修改来消除您的问题。当我重新创建这些场景时,我只能修复它,当我这样做时,它才起作用。

    我把你原来的场景留在那里(用#34;老&#34;以及故事板不会混淆),所以也许你可以花时间搞清楚什么是错的,但是我没有看到它。也许故事板中有一些错误正在躲避我。也许有一些我没看到的环境。我所知道的是,当我刚刚重新创建它时,将控件复制到我的两个新场景中,它才起作用。

    就个人而言,我建议削减戈尔迪结,并完全消除容器观点。你的代码会更清晰,而且这些问题不太可能让他们的丑陋不堪。

    这不是一个令人满意的结论(不知道导致问题的原因),但至少它似乎是固定的。祝你好运。