ios - 嵌入式 UIScrollView 未加载其 subview

标签 ios uiscrollview instantiation

我这里可能有一个奇怪的 VC 结构,我只是让它有点陌生,导致它崩溃

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

我有最终的 UIView,因为我不知道如何使 ScrollView 遵守某些大小限制,所以我只添加了一个“内容 View ”。

问题是,现在“内容 View ”的数据没有加载

内容 View 的日志是:

<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}>

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

编辑以澄清:
  • 所有这些 View 都是通过 IB
  • 创建的
  • 不使用 AutoLayouts(虽然这听起来很有趣)
  • NSLog 方法在 View 层次链顶部的 View Controller 中的 ViewDidAppear 中调用。 (也许这就是问题所在?)

  • 编辑:将项目上传到 github,以便人们可以看看
    https://github.com/Pinwheeler/ChiroMatic.git

    最佳答案

    我花了很多时间浏览您的项目,但令人沮丧的是,我无法推断出导致问题的原因。但我发现我可以通过重新创建您的 PrintViewController 来解决问题。和 PrintContentViewController场景(我不得不重新创建两者来解决问题)。我为您的项目创建了一个分支并修复了这两个场景。我尝试在源代码和 git 存储库提交注释中注释我的更改,因此希望您能遵循我所做的更改。我的 fork 可在:

  • https://github.com/robertmryan/ChiroMatic

  • (当您希望我删除该存储库时让我知道。我很乐意随时删除它,因为我假设您不希望我无限期地在 github 上留下副本。)

    几点观察:
  • 你说你没有使用自动布局,但你是。 (转到 Storyboard上的第一个 Document Inspector 选项卡,您会看到“使用自动布局”被选中。)如果您想使用它,那很好(它现在是 Xcode 中的默认设置),但要预先警告您失去向后兼容性如果您使用 iOS 6 之前的 iOS 版本。自动布局很强大,但是当您第一次开始使用它时可能会很棘手。这是你的电话。
  • 在您的 PrintContentViewController ,我最重要的改变是使用标准 View Controller 场景配置(其中顶级 View 是 UIView ),我做了 UIScrollView一个 subview 。话虽如此,我认为您不需要 UIView UIScrollView 的 subview (如果你有中间的 UIView ,你会失去一些 ScrollView 功能,这是有问题的),所以我删除了它,并制作了 ScrollView 本身的所有标签和类似的 subview 。
  • 您到处都在使用容器 View ,但令我震惊的是,您正在增加不必要的复杂性。 (顺便说一句,如果您不使用这些容器 View ,您就不会遇到原始问题中提出的问题。)

    当您想从其 subview Controller 中抽象出与容器 View Controller 关联的逻辑时,自定义容器非常有用。但你不是在这里这样做。更糟糕的是,您要通过各种方式来获取 IBOutlet子 Controller 的引用并更新容器 Controller 中的属性。我衷心鼓励您重新考虑使用这些容器 View ,并将它们完全从您的项目中删除。

    如果您对容器 View 有迫切的需求,请使用它们(我喜欢它们并且一直使用它们),但我认为这里没有任何需要,而且您自己的生活变得更加复杂。

    另外,顺便说一句,使用嵌入 segue 只是 iOS 6 的一项功能,如果您需要向后兼容 iOS 5,这可能是个问题。

  • 最重要的是,在创建新项目和镜像 Storyboard时,我永远无法重现您的问题。我也无法通过对您的旧 PrintViewController 进行任何编辑来消除您的问题。和 PrintContainerViewController场景。我只有在重新创建这些场景时才能修复它,而当我这样做时,它就起作用了。

    我把你的旧场景留在那里(以“旧”开头,这样 Storyboard就不会混淆),所以也许你可以花时间找出问题所在,但我看不到。也许 Storyboard中有一些错误正在逃避我。也许有一些我没有看到的设置。我所知道的是,当我刚刚重新创建它时,将您的控件复制到我的两个新场景中,它就可以正常工作。

    就我个人而言,我建议打破僵局,完全消除容器 View 。你的代码会更干净,这类问题不太可能引起他们的丑陋。

    这不是一个令人满意的结论(不知道是什么导致了问题),但至少它看起来是固定的。祝你好运。

    关于ios - 嵌入式 UIScrollView 未加载其 subview ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15915190/

    相关文章:

    c++ - 使用 protected 构造函数在 C++ 中实例化对象

    android - 从 Java 实例化 JNI 库的多个副本

    ios - 检测以查看是否启用了iPad上的蓝牙iOS 7

    ios - 存储单例数组以供应用程序重新启动后使用?

    swift - 在 iOS 11 的键盘后面扩展 ScrollView insets

    ios - scrollView.dragging == true 在 scrollViewDidEndDragging 之后?

    java - 能够声明一个对象但不能实例化它有什么意义

    ios - 在 uiviewcontroller 中添加 subview 使其正常运行

    ios - 除非你改变它,否则你怎么能让照片永远留在那里?

    ios - 从 XIB 添加的 Swift ScrollView 根本不可滚动