【问题标题】:Container View Controller addSubview Exception容器视图控制器 addSubview 异常
【发布时间】:2012-07-03 02:02:13
【问题描述】:

我正在构建一个自定义容器 ViewController 来容纳一个 nib 的多个实例。这个 nib 包含一个 ViewController 子类为 DemoViewController

在容器的 viewWillAppear 期间,我执行以下操作:

- (void) viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    NSLog(@"Container will appear");


    if (_selectedViewController.parentViewController == self)
    {
        // nowthing to do
        return;
    }

    DemoViewController *vc = [[DemoViewController alloc] initWithNibName:@"Gauge" bundle:nil];

    NSArray *nibObjects = [[NSBundle mainBundle] loadNibNamed:@"Gauge" owner:self options:nil];
    // assuming the view is the only top-level object in the nib file (besides File's Owner and First Responder)
    UIView *nibView = [nibObjects objectAtIndex:0];

    // add as child VC
    [self addChildViewController:vc];

    [view1 addSubview:nibView];

    // notify it that move is done
    [vc didMoveToParentViewController:self];

}

在运行时,我收到以下异常:

2012-07-02 21:59:22.734 ContainerViewController[21747:f803] 加载容器视图 2012-07-02 21:59:22.737 ContainerViewController[21747:f803] 容器将出现 2012-07-02 21:59:22.740 ContainerViewController [21747:f803] 仪表视图已加载 2012-07-02 21:59:22.742 ContainerViewController[21747:f803] 仪表将移至父控制器 2012-07-02 21:59:22.743 ContainerViewController[21747:f803]-[DemoViewController superview]:无法识别的选择器发送到实例 0x6a7daa0 2012-07-02 21:59:22.745 ContainerViewController[21747:f803] *** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[DemoViewController superview]:无法识别的选择器发送到实例 0x6a7daa0” *** 首先抛出调用堆栈: (0x13c9022 0x155acd6 0x13cacbd 0x132fed0 0x132fcb2 0x4fe4f 0x4a14b 0x2d2c 0xdc38f 0xdc5eb 0xdd4ed 0x4aa0c 0x4ff92 0x4a14b 0x39550 0x39670 0x39836 0x4072a 0x11596 0x12274 0x21183 0x21c38 0x15634 0x12b3ef5 0x139d195 0x1301ff2 0x13008da 0x12ffd84 0x12ffc9b 0x11c65 0x13626 0x276d 0x26d5) 终止称为抛出异常(lldb)

有人知道这里发生了什么吗?不幸的是,关于容器视图控制器的文档太少了,所以我很难过。

【问题讨论】:

  • NSLog() view1 和 nibView 的类。
  • 2012-07-02 22:45:36.651 ContainerViewController[22124:f803] view1: > ------------ 2012-07-02 22:45:36.651 ContainerViewController[22124:f803] nibView:

标签: ios uiviewcontroller containers addsubview


【解决方案1】:

顺便说一句,您为什么要尝试通过 NIB 检索视图?为什么不是以下?

childController = [[FirstContainedViewController alloc] initWithNibName:@"FirstContainedView" bundle:nil];
[self addChildViewController:childController];
[self.view addSubview:childController.view];
[childController didMoveToParentViewController:self];

这对我有用,而且看起来更简单。我一定不明白你为什么要这么做。

【讨论】:

  • 我知道距离我们上次讨论这个问题已经有一周了,但我似乎在按照你的建议执行收容时仍然遇到同样的错误。 : *** 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:'-[UIViewController _loadViewFromNibNamed:bundle:] 加载了“Gauge”笔尖,但未设置视图出口。'
  • 有没有专门设置childcontroller的view?
  • @shred444 嗯。您是否尝试过通过标准的presentViewControllerpushViewController 使用NIB 来确保您的NIB 的所有插座都正确连接?这听起来像是我忘记完成 NIB 插座配置时遇到的典型错误,这很容易做到(例如,在 IB 中选择视图,查看其插座,确保它已连接到“文件所有者”并且“文件所有者”的自定义类正确连接到您的视图控制器)。
  • Robert,在阅读另一个线程时,[link]stackoverflow.com/questions/7103130/… 我发现您通常会使用 file>new 创建一个带有视图控制器的新笔尖,然后选中用于创建笔尖的框。这有效!
  • @shred444 是的,这将确保您的网点从一开始就正确设置。但很高兴听到你的工作正常。
【解决方案2】:

事实证明,通过“Xcode's File->New->New File->Cocoa Touch->UIViewController subclass->with XIB for user interface”创建一个 nib 解决了我的问题。

我最初是单独创建所有内容,然后通过单击笔尖的框架并将其链接到视图控制器(就像在故事板中那样)将它们链接在一起。事实证明这是完全错误的。

相反,您需要将文件的所有者链接到 ViewController 文件。

感谢大家的帮助!

【讨论】:

    【解决方案3】:

    您的 NSLog() 完美地说明了这个问题。该 XIB 的顶级对象显然不是 UIView,它很可能是文件的所有者对象,它指向 DemoViewController。在调用该方法时,您已将-addSubview 发送到视图控制器。

    【讨论】:

    • 有趣。那么我不可能将视图控制器放在笔尖内吗?
    • 不,完全可以将视图控制器放在 nib 中,您只是使用了错误的对象索引。
    • 我最初有 vc.view 而不是 nibview,但返回错误“加载了“仪表”笔尖,但未设置视图出口。” - 这不可能是因为我肯定设置了它
    • 是从文件的所有者->视图,还是从对象->视图
    • 它是从 object->view 设置的(它是灰色的)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多