我有一个viewcontroller(vc1),其中我添加了另一个viewcontroller(vc2)作为子视图。当您点击子视图(vc2)中包含的视图(tappingView)时,会触发UITapGestureRecognizer。我想在子视图控制器(vc2)中处理这个水龙头,而不是从第一个视图控制器(vc1)......但是当我点击我的视图时它会一直崩溃。
以下是层次结构总结:
-VC1
--vc2
--- tappingView
以下是代码示例:
ViewController1(viewDidLoad):
- (void)viewDidLoad
{
ViewController2 *vc2 = [[ViewController2 alloc] init];
[[self view] addSubview:[vc2 view]];
}
ViewController2(viewDidLoad):
- (void)viewDidLoad
{
UIView *tappingView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 60.0, 80.0)];
[[self view] addSubview:tappingView];
UITapGestureRecognizer *tapGestureRecognize = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapGestureRecognizer:)];
[tappingView addGestureRecognizer:tapGestureRecognize];
}
ViewController2(singleTapeGestureRecognizer :):
- (void)singleTapGestureRecognizer:(id)sender {
NSLog(@"Tap gesture");
}
当我点击我的视图(tappingView)时,我一直在崩溃(BAD_ACCESS)。
任何人都知道为什么?
答案 0 :(得分:2)
您不应该只是将另一个视图控制器的视图添加到视图中 - 您应该将该控制器设置为vc1的childViewController。将vc1中的viewDidLoad更改为:
- (void)viewDidLoad {
ViewController2 *vc2 = [[ViewController2 alloc] init];
[self addChildViewController:vc2];
[vc2 didMoveToParentViewController:self];
[[self view] addSubview:[vc2 view]];
}
目前尚不清楚为什么你一开始就这样做。为什么不将vc2作为模态视图控制器呢?
答案 1 :(得分:1)
在这个块中
- (void)viewDidLoad
{
ViewController2 *vc2 = [[ViewController2 alloc] init];
[[self view] addSubview:[vc2 view]];
}
您的ViewController2
不保留(addSubview
仅保留视图,而不是视图控制器。)
要解决此问题,请将vc2
声明为strong
属性,而不是变量。
self.vc2 = [[ViewController2 alloc] init];
或者更好,正如有人建议的那样,将vc2
添加为子视图控制器。
答案 2 :(得分:0)
UITapGestureRecognizer
的目标采用UIGestureRecognizer
参数,而非id
。即:
- (void)singleTapGestureRecognizer:(UIGestureRecognizer *)sender {
NSLog(@"Tap gesture");
}
此外,您要在viewDidLoad
中设置框架,您应该在viewWillAppear:
中进行设置。
答案 3 :(得分:-1)
使用下面的代码
- (void)singleTapGestureRecognizer:(UIGestureRecognizer *)sender
而不是
- (void)singleTapGestureRecognizer:(id)sender.
因为它必须有UIGestureREcognizer而不是id。