如何在子视图中处理UITapGestureRecognizer?

时间:2013-08-06 00:07:13

标签: iphone ios

我有一个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)。

任何人都知道为什么?

4 个答案:

答案 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。