【问题标题】:How to handle UITapGestureRecognizer in a subview?如何在子视图中处理 UITapGestureRecognizer?
【发布时间】:2013-08-06 00:07:12
【问题描述】:

我有一个视图控制器 (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)。

有人知道为什么吗?

【问题讨论】:

  • 使用 - (void)singleTapGestureRecognizer:(UIGestureRecognizer *)sender 代替 - (void)singleTapGestureRecognizer:(id)sender。因为它必须有 UIGestureREcognizer 而不是 id。

标签: iphone ios


【解决方案1】:

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

- (void)viewDidLoad {

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

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

【讨论】:

  • 没错,只有你把控制器添加为子控制器,tap才可以处理。
【解决方案2】:

在这个区块

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

您的ViewController2保留(addSubview 仅保留视图,不保留视图控制器)。

要修复它,请将 vc2 声明为 strong 属性,而不是变量。

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

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

【讨论】:

  • 解决了我的问题。有时加班不适合我...谢谢!
【解决方案3】:

UITapGestureRecognizer 的目标采用 UIGestureRecognizer 参数,而不是 id。即:

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

此外,您在 viewDidLoad 中设置框架,而您应该在 viewWillAppear: 中执行此操作。

【讨论】:

  • 虽然正确地将参数输入到操作方法中会更好,但不会导致此错误。
【解决方案4】:

使用下面的代码

- (void)singleTapGestureRecognizer:(UIGestureRecognizer *)sender 

而不是

- (void)singleTapGestureRecognizer:(id)sender.

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

【讨论】:

  • 没关系。如果使用id,则sender 只是从UIGestureRecognizer*(或任何真正的类)转换为id
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多