将自定义UIView添加到UINavigationItem

时间:2012-11-28 15:29:21

标签: ios uinavigationitem

我有3个按钮,我尝试将其添加为应用程序中某些视图的自定义标题。在故事板中添加它们可以正常工作,我可以将它们连接到视图控制器中的方法。

我最近想将这些按钮添加到其他页面,并希望将它们抽象为可以在不同页面上重复使用的控件。我已经设置了,但是使用普通方法添加它时遇到了困难。

Maybe this picture will help explain what I'm talking about

通常我将视图控制器添加为子视图控制器,然后将视图添加为子视图,在这种情况下,我将其添加到故事板中的占位符,代码如下所示:

// Setup Header
HeaderViewController * headerViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"HeaderViewController"];
[headerViewController.view setFrame:CGRectMake(0.0f, 0.0f, [headerViewController.view frame].size.width, [headerViewController.view frame].size.width)];
[_headerView addSubview:headerViewController.view];

这允许我让视图看起来正确但是当我点击按钮时它崩溃了,因为它找不到具有与按钮点击相关联的IBActions的视图控制器。通常我会添加以下代码,它将被处理:

[self addChildViewController:headerViewController];

在这种情况下,我收到一条错误说明:

由于未捕获的异常'UIViewControllerHierarchyInconsistency'而终止应用程序,原因:'子视图控制器:应该有父视图控制器:但实际的父级是:'

我理解这意味着它认为自定义标题视图控制器的父级应该是导航控制器,将其设置为导航控制器的子级也不起作用。它将标题视图添加到正在显示的PageViewControllers视图的顶部。我可能错过了一些简单的东西

我尝试过的一些组合在模拟器上工作,但它们都不能在设备上工作,因此如果您使用类似的配置,请务必在设备上查看它,如果它似乎在模拟器。

可以提供任何想法或其他信息以提供帮助吗?

2 个答案:

答案 0 :(得分:2)

将您的IBActions放在标题视图控制器上,然后将其绑定到xib中,而不引用任何其他视图控制器。

然后,在标题视图控制器中,您可以将它们传递给它的父级。这样就决定了谁在运行时接收动作,而不是作为你的xib的一部分。

- (IBAction)button1Pressed {
    if ([self.parentViewController respondsToSelector:@selector(button1Pressed)])
        [self.parentViewController performSelector(button1Pressed)];
    else
        NSLog(@"Parent doesn't care about button 1 : %@", self.parentViewController);
}

您还可以检查父母是否可以回复:)

答案 1 :(得分:0)

我无法使用建议的其他方法来解决这个问题,而不是因为他们错了我无法让他们工作。

我最终创建了一个带有相应xib的UIView子类,并将IBActions放入UIView子类中。这需要一个与保持视图控制器的弱链接,以便为触发的IBAction显示模态视图。

相关问题