IBAction 未从子视图按钮单击调用
IBAction not getting called from Subviews button click
所以我整个晚上都在尝试解决我的问题,即单击位于 UIViewController 中的按钮不会触发 IBAction。
我的情况
我正在使用故事板构建我的应用程序,我的主要 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];
到目前为止一切正常,我提到它是因为它可能是相关的。
顶级控制器
现在我想在 MainViewController
中再添加一个 ViewController,这次在最上面。我们将顶视图控制器称为 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
单击屏幕上的任意位置触发定义的操作在上面)
- 所有尺寸、id 和相应的 类 都已验证
viewDidLoad
of TopViewController
被调用
请帮我摆脱困境。谢谢!
您是使用实例变量保留 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
视图控制器发送消息。
所以我整个晚上都在尝试解决我的问题,即单击位于 UIViewController 中的按钮不会触发 IBAction。
我的情况
我正在使用故事板构建我的应用程序,我的主要 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];
到目前为止一切正常,我提到它是因为它可能是相关的。
顶级控制器
现在我想在 MainViewController
中再添加一个 ViewController,这次在最上面。我们将顶视图控制器称为 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
单击屏幕上的任意位置触发定义的操作在上面) - 所有尺寸、id 和相应的 类 都已验证
viewDidLoad
ofTopViewController
被调用
请帮我摆脱困境。谢谢!
您是使用实例变量保留 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
视图控制器发送消息。