1

我正在浏览一些旧代码并试图检测一些难以发现的错误。我遇到了 UIViewController 的不寻常用法,其中分配了控制器,存储在属性中,并将其视图添加为子视图,而不是呈现整个控制器。

让我首先说我知道这是一种 hacky 和不正常的。也就是说,以下实施中的危险是什么?这可能会导致任何意想不到的副作用吗?如果MyOtherViewController由于在某个时候收到内存警告而卸载它的视图并重新创建它,这会导致任何奇怪的行为吗?

@interface MyViewController()
@property (nonatomic, strong) MyOtherViewController *otherVC;
@end

@implementation MyViewController

- (void)viewDidLoad
{
    self.otherVC = [[MyOtherViewController alloc] init];
    [self.view addSubview:self.otherVC.view];
}

@end
4

3 回答 3

2

您正在做的是创建自定义视图控制器容器。这不是一件坏事,但你没有按照你应该做的方式去做。UIViewController 的类参考中有一个部分准确解释了如何完成您正在尝试做的事情。

于 2013-10-28T21:03:03.427 回答
1

看看以编程方式显示视图控制器内容

https://developer.apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/UsingViewControllersinYourApplication/UsingViewControllersinYourApplication.html#//apple_ref/doc/uid/TP40007457-CH6-SW8

请注意: 重要提示:切勿将视图控制器的视图直接安装到视图层次结构中。

于 2013-10-28T21:48:45.887 回答
0

我刚刚在我转移到的项目中发现了一个令人讨厌的 BAD EXEC 崩溃(请参阅下面的讨厌的错误)。

我可以说使用 UIViewController 非常糟糕,因为:

  • 你必须确保控制器没有被释放。视图不会,因为它在具有超级视图的视图层次结构中,但控制器没有对象来保留它。如果它作为 rootController 添加到窗口中,添加到选项卡控制器,导航控制器或由另一个控制器呈现(正常使用),那就没问题了。

  • 除了 viewDidLoad 之外,它不会收到您希望调用的方向更改和消息。

  • 讨厌的虫子。例如,在 iOS 5 中,如果在您关闭模态控制器之前未释放此控制器,您将遇到 BAD EXEC 崩溃,这会让您发疯。似乎 SDK 中的动画方法希望您的视图控制器在关闭模式动画期间出现。

于 2013-12-04T06:17:05.900 回答