【问题标题】:ViewController not loading subviews from nib in ARC project running on iOS 4.3?ViewController 没有从在 iOS 4.3 上运行的 ARC 项目中的 nib 加载子视图?
【发布时间】:2012-02-03 18:44:55
【问题描述】:

我的团队最近将一个相当大的项目转换为 ARC。转换进展顺利,应用程序运行良好,并且在 5.0 上运行良好。

问题出在 4.3 上。任何使用普通 init 在代码中实例化的视图控制器都不会加载 vc 视图的任何子视图(这在 5.0 上确实有效)

总结如下:

[[MyViewController alloc] init] 实例化一个视图控制器。 (UIViewController的init调用initWithNibName:nil bundle:nil)

这会加载一个与视图控制器 (MyViewController.xib) 同名的 nib

*预期:nib 正常实例化,顶级视图的所有子视图和所有出口设置

*实际:nib 被实例化,并且 MyViewController 对象的 view 属性被设置。但是,视图的子视图数组是空的,并且这些视图的任何出口都为零,并且视图在呈现时显示为空

*解决方法:使用

实例化 VC/加载 nib
[[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil]

我无法在一个干净的项目中复制这一点,无论是从 ARC 开始还是转换为 ARC。我和我的团队正在努力解决这个问题,但与此同时,我想知道是否有其他人遇到过这个问题并找到了根本原因或触发因素。

【问题讨论】:

    标签: objective-c ios automatic-ref-counting nib


    【解决方案1】:

    跟进以防其他人遇到此问题。

    由于我们支持 4.x 并使用 ARC,我们决定使用 Mike Ash 的 MAZeroingWeakRef 来获取 4.x 中的弱指针。最终,我们充分隔离了问题,将其追溯到 MAZeroingWeakRef。我们在 MAZWR 项目和 github 上发布了一个问题,Mike 解释了发生了什么:

    https://github.com/mikeash/MAZeroingWeakRef/issues/13

    (基本上 MAZWR 将 VC 类的内部名称更改为类似 TestViewController_MAZeroingWeakRefSubclass 的名称。VC 的 init 依赖于此类名称来加载其关联的 nib ——所以当它被更改时,它无法找到 nib。通过调用 initWithNibName :bundle: 并明确提供相关 nib 正确加载的类名。)

    【讨论】:

      【解决方案2】:

      不确定是什么导致了您的问题,但如果您为所有视图控制器创建一个通用基类,您可以将 init 方法定义为:

       - (id)init
       {
           return [self initWithNibName:NSStringFromClass([self class]) bundle:nil];
       }
      

      这样您就可以保证它加载了正确的 nib,而不必在任何地方输入明确的 nib 名称而弄乱您的代码。

      顺便说一句,我有时不得不对 UITableViewControllers 使用这个技巧,因为它们的 init 方法似乎不遵循惯例。

      【讨论】:

      • 从概念上讲,这也是 UIViewController 正在做的事情,所以它遇到了同样的问题。请参阅下面选择的答案以获取解释。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多