【问题标题】:UIViewController within a UIViewControllerUIViewController 中的 UIViewController
【发布时间】:2012-07-19 01:31:01
【问题描述】:

所以我有一个 viewControllerA,我想向它添加另一个由 viewControllerB 管理的 View。在 viewControllerB 中只有一个 UISlider 激活了一个简单的操作。如果我不触摸这个 UISlider,它不会崩溃,一旦我使用 UISlider,它就会崩溃。我正在使用 ARC。我正在使用:

[self.view addSubView: viewControllerB.view];

将 viewControllerB 添加到 viewControllerA。我错过了什么吗?谢谢。

好的。这看起来是一个非常简单的情况。我刚刚添加了一个视图控制器和一个动作。这里是github上的demo项目代码:https://github.com/randomor/Demo

我希望它工作的原因是因为我有另一个应用程序将在现场创建一个视图控制器并将其添加到另一个视图。而且我不想以模态方式进行,因为我不希望新的视图控制器覆盖整个屏幕。谢谢。

解决方案:所以我现在只使用最新的 ViewController 包含 API:

[self addChildViewController:viewControllerB];

有效!只要我添加了这一行,事件就会传递给它自己的控制器并且它停止崩溃。

【问题讨论】:

    标签: objective-c ios cocoa-touch


    【解决方案1】:

    我推荐你,使用下面的代码

    ViewControllerA.h

        #import "ViewControllerB.h"
    

    ViewControllerA.m(你要推送新控制器的地方)

    ViewControllerB *newController = [[ViewControllerB alloc]init];
    [self presentModalViewController:newController animated:YES];
    

    ViewControllerB.m 你需要

    [self.presentingViewController dismissModalViewControllerAnimated:YES];
    

    让它再次消失。

    关于一个打开屏幕的多个控制器(Apple ViewController 编程指南):

    Each custom view controller object you create is responsible for managing exactly 
    one screen’s worth of content. The one-to-one correspondence between a view controller 
    and a screen is a very important consideration in the design of your application. 
    You should not use multiple custom view controllers to manage different portions 
    of the same screen. Similarly, you should not use a single custom view controller 
    object to manage multiple screens worth of content.
    

    【讨论】:

    • 我更新了代码 - 请尝试一下 =) 它必须工作 :)
    • 好的,现在我将代码从 ViewDidLoad 移出到另一个由按钮触发的操作,它现在可以使用模态方法工作。但我真正想要实现的不是用它覆盖整个屏幕。我希望仍然能够使用父视图的其他部分。
    • 那么您必须将滑块设为 viewcontrollerA 的子视图,但没有自己的 controllerB。
    • 是的,我想将其分开,因为我不想将代码混合在一起。但也许这是唯一的出路?但是这些容器视图控制器如 tabViewcontroller 或 splitviewcontroller 是如何实现的呢?我在这里发现了一个类似的问题:stackoverflow.com/questions/10046705/…
    • 是的。这是要走的路。我在我的答案中添加了一段来自苹果的 viewcontroller 编程指南。每个屏幕一个控制器。对您的 tabbarquestion:tabbarcontroller '呈现'您的实际视图控制器,它不处理您视图中的交互。
    【解决方案2】:

    你应该尽量避免嵌套 UIViewControllers 的做法。虽然它在 iOS5 中得到技术支持,但出于多种原因,包括您遇到的问题类型(您有一个指向 UIViewController 的悬空指针,这就是您崩溃的原因),但这是不明智的。

    http://blog.carbonfive.com/2011/03/09/abusing-uiviewcontrollers/

    【讨论】:

    • 这是一个很棒的链接。谢谢!我也在观看 wwdc11 关于视图控制器遏制的演讲。
    【解决方案3】:

    虽然这个问题非常模糊,但我想你没有保留对视图控制器 B 的引用,因此当视图 B 尝试与之交互时,它会导致 EXC_BAD_ACCESS。

    【讨论】:

    • 谢谢。你如何保持对 viewControllerB 的引用?我不是在做 ivar。我只是在 ViewDidLoad 中当场创建它并将其添加到视图中。
    • @randomor 我通常看到的做法是在父视图上创建一个属性来保存对子视图的引用。不过,我认为这不是您的问题,因为视图保留了它们的子视图。
    【解决方案4】:

    设置为滑块目标的对象是什么?如果是EXC_BAD_ADDRESS,那么您可能没有保留目标,很可能是滑块的视图控制器。

    【讨论】:

    • 滑块的目标是 viewControllerB 因为它拥有滑块。我基本上是分配并初始化 viewControllerB 并将其添加到 ViewDidLoad 的 viewControllerA 中。是的,它是 EXC_BAD_ADDRESS,但我使用的是 ARC。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-16
    相关资源
    最近更新 更多