将按钮超级视图控制器添加到另一个视图控制器时,UIButton 目标无法识别

Posted

技术标签:

【中文标题】将按钮超级视图控制器添加到另一个视图控制器时,UIButton 目标无法识别【英文标题】:UIButton target not recognized when adding button superview controller to another viewController 【发布时间】:2012-06-04 06:28:48 【问题描述】:

我创建了 UIViewController 的子类 toolbarViewController ,我在这个视图控制器中声明了一个 UIButton 并指定它的目标如下

UIButton *button = [[UIButton alloc]initWithFrame:myFrame];
[button addTarget:self action:@selector(doSomething) forContorlEvents:UIControlEventTouchUpInside];

然后我在不同的视图控制器中执行以下操作

toolbarViewController *toolbar = [[toolbarViewController alloc]init];
[self.view addSubview:toolbar.view];

问题是当我按下按钮时出现异常:无法识别的选择器(doSomething)发送到实例,我在这里做错了什么?

toolbarViewController.h 中的 doSomething 声明

-(void)doSomething;

在toolbarViewController.m中

-(void)doSomething NSLog("doSomething got called"); 

【问题讨论】:

你实现doSomething方法了吗?如果是,在哪个班级? 您的 doSomething 是否接受参数?能否请您出示您的 doSomething 定义? 当然我实现了doSomething,我是在toolbarViewController类中实现的 您的 addTarget:self 需要是您拥有 doSomething 方法的类 obj,例如 addTarge:yourCalassObj 【参考方案1】:

检查doSomething 的声明。如果你声明像-(IBAction)doSomething:(id)sender 这样的 IBAction,你应该添加像

这样的选择器
[button addTarget:self action:@selector(doSomething:) forContorlEvents:UIControlEventTouchUpInside];

而不是

[button addTarget:self action:@selector(doSomething) forContorlEvents:UIControlEventTouchUpInside];

【讨论】:

我将 doSomething 的定义更改为 (IBAction)doSomething:(id)sender 并且效果很好,谢谢【参考方案2】:

如果你使用ARC,你分配toolbarViewController,但它有relese。你可以试试这个:

ViewController.h
@interface ViewController : UIViewController
    toolbarViewController * toolbar;

@property(nonatomic,strong) toolbarViewController * toolbar;


ViewController.m
@synthesize toolbar = _toolbar;


    toolbar = [[toolbarViewController alloc]initWithNibName:@"toolbarViewController" bundle:[NSBundle mainBundle]];

你分配按钮可以做到这一点:

UIButton *bt = [UIButton buttonWithType:UIButtonTypeRoundedRect];
        bt.frame = myFrame;
        [bt addTarget:self action:@selector(dosomething) forControlEvents:UIControlEventTouchUpInside];
        [self.view addSubview:bt];

【讨论】:

【参考方案3】:

一种可能的情况是,如果您将UITapGestureRecognizer 添加到UIButton 的超级视图。 在 ios5 上,UITapGestureRecognizers 似乎存在问题,无法取消视图中的点击。

所以你需要做的就是设置

tapGesture.cancelsTouchesInView = NO;

如果有帮助请告诉我!

【讨论】:

以上是关于将按钮超级视图控制器添加到另一个视图控制器时,UIButton 目标无法识别的主要内容,如果未能解决你的问题,请参考以下文章

ios - 将目标添加到另一个视图控制器中的按钮

如何通过单击按钮在 Swift UI 中从一个视图导航到另一个视图

如何在单击按钮时从一个视图控制器导航到另一个视图控制器?

将 segue 添加到拆分视图控制器

单击tableview标题按钮时如何将tableviewcell内的collectionview中的数据显示到另一个视图控制器

当我将视图添加到另一个视图(并且这两个视图都由视图控制器控制)时,我真的应该使用 addChildViewController 吗?