在UIView中调用UIViewController视图作为子视图的问题

时间:2014-10-16 16:51:58

标签: ios objective-c exc-bad-access addsubview

我正在我的一个项目中实施MDSpreadView,一个第三方控制器。我只是简单地包含了与它相关的每个文件,包括xib。将其称为子视图。

调用视图的层次结构是这样的:有一个uiviewcontroller,我在其中添加UIView作为子视图,从该子视图我将uiviewcontroller称为子视图。

     MDViewController *MDvc = [[MDViewController alloc]initWithNibName:@"MDViewController_iPhone" bundle:nil ];
     [self addSubview:MDvc.view];

看起来很好但是当我触摸滚动或选择或任何内容时,选择代理会发生Thread 1:EXC_BAD_ACCESS错误。代表是在demo proj中实现的。

这是图像

我知道在调用子视图时存在一些问题。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

从一个控制器中取出视图并将其作为子视图插入不同控制器的想法是崩溃的常见原因。如果必须这样做,请确保未释放原始控制器(在这种情况下为MDViewController)。您可以通过使其成为劫持其视图的对象的强大属性来实现,或者更好地查看有关如何实现容器控制器的文档。

答案 1 :(得分:0)

最后了解如何处理多个视图,尤其是当你有子视图和viewcontroller时。解决方案非常简单,在这种情况下你需要有代表,或者有一个很好的东西,苹果给自己的是NSNotification。我确实通过NSNotification解决了我的问题。按下按钮(从那里我必须打电话给其他视图)我发布这样的通知:

     [[NSNotificationCenter defaultCenter] postNotificationName:@"WhatEverYouWantTocallIt" object:nil];

我在课堂上添加了观察者,我需要打电话,如下:

     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(bringSpreadViewToFront) name:@"WhatEverYouWantTocallIt" object:nil];

AND添加了一个选择器,在选择器中你应该根据你做过的场景处理它:

- (无效)bringSpreadViewToFront {

NSArray *viewsToRemove = [self.view subviews];
for (UIView *v in viewsToRemove) {
    [v removeFromSuperview];
}

MDViewController *md = [[MDViewController alloc] initWithNibName:@"MDViewController_iPhone" bundle:nil];


    [self presentViewController:md animated:YES completion:nil];

}

我首先逐个删除子视图,然后呈现我的视图控制器,提出推动您的选择。它很完美..干杯:)

谢谢Phillip让我朝着接近解决方案的方向发展。