将按钮超级视图控制器添加到另一个视图控制器时,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 目标无法识别的主要内容,如果未能解决你的问题,请参考以下文章
如何通过单击按钮在 Swift UI 中从一个视图导航到另一个视图
单击tableview标题按钮时如何将tableviewcell内的collectionview中的数据显示到另一个视图控制器
当我将视图添加到另一个视图(并且这两个视图都由视图控制器控制)时,我真的应该使用 addChildViewController 吗?