2

我有一个视图控制器(vc1),我在其中添加了另一个视图控制器(vc2)作为子视图。当您点击子视图 (vc2) 中包含的视图 (tappingView) 时,将触发 UITapGestureRecognizer。我想在子视图控制器(vc2)中处理这个点击,而不是从第一个视图控制器(vc1)......但是当我点击我的视图时它会一直崩溃。

这是层次结构总结:

-vc1
--vc2
---点击查看

这是一个代码示例:

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

4 回答 4

2

您不应该只是将另一个视图控制器的视图添加到您的视图中——您应该使该控制器成为 vc1 的 childViewController。将 vc1 中的 viewDidLoad 更改为:

- (void)viewDidLoad {

    ViewController2 *vc2 = [[ViewController2 alloc] init];
    [self addChildViewController:vc2];
    [vc2 didMoveToParentViewController:self];
    [[self view] addSubview:[vc2 view]];
}

目前尚不清楚为什么你首先要这样做。为什么不将 vc2 呈现为模态视图控制器呢?

于 2013-08-06T00:18:19.397 回答
1

在这个街区

- (void)viewDidLoad
{
    ViewController2 *vc2 = [[ViewController2 alloc] init];
    [[self view] addSubview:[vc2 view]];
}

ViewController2没有被保留(addSubview只保留视图,而不是视图控制器)。

要修复它,请声明vc2strong属性,而不是变量。

self.vc2 = [[ViewController2 alloc] init];

或者更好,正如有人建议的那样,添加vc2为子视图控制器。

于 2013-08-06T02:48:52.027 回答
0

UITapGestureRecognizer接受UIGestureRecognizer论点的目标,而不是id. IE:

- (void)singleTapGestureRecognizer:(UIGestureRecognizer *)sender {
  NSLog(@"Tap gesture");
}

此外,您正在设置框架viewDidLoad,您应该这样做viewWillAppear:

于 2013-08-06T00:19:45.720 回答
-1

使用下面的代码

- (void)singleTapGestureRecognizer:(UIGestureRecognizer *)sender 

代替

- (void)singleTapGestureRecognizer:(id)sender.

因为它必须有 UIGestureREcognizer 而不是 id。`

于 2013-08-06T06:16:52.863 回答