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

Posted

技术标签:

【中文标题】在 UIView 中调用 UIViewController 视图作为子视图的问题【英文标题】:Issue in calling UIViewController view as subview in UIView 【发布时间】:2014-10-16 16:51:58 【问题描述】:

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

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

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

看起来不错,但是当我触摸滚动或选择或进行任何操作时,选择委托处会出现Thread 1:EXC_BAD_ACCESS 错误。而代表是在演示项目中实现的。

这是图片

我知道调用子视图有一些问题。我该如何解决?

【问题讨论】:

【参考方案1】:

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

【讨论】:

我正在研究它,感谢您指出正确的方向。如果你能帮助我一些好东西,你的努力将不胜感激。【参考方案2】:

终于知道如何处理多个视图,尤其是当您有子视图和视图控制器时。解决方案非常简单,在这种情况下你需要有委托,或者苹果给自己的一个很棒的东西就是 NSNotification。我确实通过 NSNotification 解决了我的问题。在按钮按下(从我必须调用其他视图)我发布这样的通知:

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

我在需要调用的类中添加了观察者,如下所示:

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

并添加了一个选择器,在选择器中,你应该根据我这样做的场景来处理它:

-(void)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 将我推向接近解决方案的方向。

【讨论】:

以上是关于在 UIView 中调用 UIViewController 视图作为子视图的问题的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式创建控制器和 UIView 而不使用界面构建器? [关闭]

UIPageViewController 和 UIScrollView

谁负责在自定义 UIViewController 容器中调用 viewWillLayoutSubviews()/viewDidLayoutSubviews()?

我必须使用协议/委托来让 ViewController 执行在另一个类中创建的 UIButton 的操作吗?

如何在 UIView 类中调用 presentViewController?

在 UIView 中调用 presentModalView 控制器