未通过“子视图”按钮调用IBAction按钮单击

时间:2016-06-22 00:07:55

标签: ios objective-c uiviewcontroller hierarchy

所以我花了整整一个晚上试图解决我的问题,点击位于UIViewController的按钮不会触发IBAction。

我的情况

我正在使用storyboard构建我的应用程序,而我的主ViewController是一个TabBarViewController。 TabBarViewController的一个项目是,我们称之为MainViewController

MainViewController后面有BackgroundViewController,其中只包含相机预览而没有其他内容。

BackgroundViewController内添加了

MainViewController,如下所示:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
BackgrondViewController *bckgController = (BackgrondViewController *)[storyboard instantiateViewControllerWithIdentifier:@"background"];

[self.view addSubview:bckgController.view];
[self.view sendSubviewToBack:bckgController.view];

到目前为止一切都有效,我提到它可能是相关的。

TopController

现在我想将另一个ViewController添加到MainViewController,这次是在顶部。我们将顶视图控制器称为TopViewController

所以首先我这样设置它:

TopViewController *topController = (TopViewController *)[storyboard instantiateViewControllerWithIdentifier:@"top"];
topController.view.backgroundColor = [UIColor clearColor];

我添加了clearColor,因为在我的应用中需要它以及已确认,这没有任何改变(相信我,我尝试过)。

好的,现在我添加新创建的视图如下(我们仍然在MainViewController

 [self.view addSubview:topController.view];
 [self.view bringSubviewToFront:topController.view];

事实上它只显示透明视图,中间只有一个按钮。

问题

无论我尝试什么,我都不能让按钮调用它的IBAction方法。

已知事实和我尝试的内容

  • TopViewController实际上位于MainViewController次观看之上,我通过获取MainViewController的所有子视图来检查,获取最后一个元素并将其与TopViewController的视图进行比较
  • IBAction正确链接到我需要点击的按钮(通过故事板和鼠标悬停方法确认)
  • TopViewController添加到TabBar工作正常,Button完成其工作
  • 按钮在视觉上可点击,并在点击时执行默认动画
  • 设置topController.view.userInteractionEnabled = YES不起作用
  • TopViewController上添加单击处理程序并点击屏幕上的任何位置都不起作用,但是将其添加到MainViewController确实有效(点击屏幕上的任意位置会触发定义的操作,尽管TopViewController处于启用状态顶部)
  • 验证所有尺寸,身份证和相应类别
  • viewDidLoad TopViewController被称为

请帮我摆脱这个堵塞。谢谢!

1 个答案:

答案 0 :(得分:1)

您是通过使用实例变量或属性来保留topController吗?

一种简单的方法是在MainViewController.h文件中创建一个属性。

@interface MainViewController : UIViewController
    @property (nonatomic, strong) TopViewController *topViewController;
@end

或者在MainViewController.m文件的顶部

@interface MainViewController ()
    @property (nonatomic, strong) TopViewController *topViewController;
@end

然后在创建属性后随时设置该属性。

self.topViewController = topController;

<强>解释

-[UIView addSubview:]保留视图,但不保留视图控制器。如果您不保留视图控制器,则ARC将在该功能结束时释放视图控制器。您可以通过覆盖-[TopViewController dealloc]来验证这一点。当您按下按钮时,它会尝试向现在的nil视图控制器发送消息。