所以,我在叠加视图中添加了一个手势识别器.当点击屏幕时,我希望这个覆盖层消失.话虽如此,添加手势识别器会覆盖"内部触碰"和其他按钮点击事件.我需要把这个拿回来,所以我需要重新安装检测识别器.我可以使用这种方法,但我有一个问题.下面是我的代码-

- (void)helpClicked
{
    CGRect visibleBounds = [self convertRect:[self bounds] toView:viewContainer];
    CGFloat minimumVisibleX = CGRectGetMinX(visibleBounds);
    UIImageView * helpOverlay = [[UIImageView alloc]initWithFrame:CGRectMake(minimumVisibleX, 0, 1024, 768)];
    UIImage * helpImage = [UIImage imageNamed:@"HelpOverLay.png"];
    [helpOverlay setImage:helpImage];
    helpOverlay.tag = 50;
    self.scrollEnabled = NO;
    [self addSubview:helpOverlay]; 
    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] 
                               initWithTarget:self
                               action:@selector(dismissView)];

[self addGestureRecognizer:tap];    

}

在这里,我将从另一个视图中移除覆盖层.

- (void) dismissView
{
    UIView *overlay = [self viewWithTag:50];
    [overlay removeFromSuperview];
    self.scrollEnabled = YES;
}

我的问题是如何在第二种方法中移除手势识别器?我不能将变量tap传递到这个方法中,也不能在前面的方法中删除它.有什么建议吗?当涉及事件时,我遇到了很多传递变量的问题.

推荐答案

WWDC 2015, Cocoa Touch Best Practices开始,如果以后需要访问,建议您保留一个属性或iVar,不要使用viewWithTag:.

Moto:属性而不是标签

这样可以避免一些麻烦:

  1. 在处理多个手势时,可以通过访问属性直接删除所需的手势并将其删除.(无需重复所有视图的手势即可删除正确的手势)
  2. 在迭代时,如果视图上有多个标记,并且与特定标记发生冲突,则通过标记找到正确的手势会产生误导

(即)你第一次用标签实现了它,一切正常

解决方案

申报iVar

@implementation YourController {
    UITapGestureRecognizer *tap;
}

设置视图

- (void) helpClicked {
    //Your customization code

    //Adding tap gesture
    tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissView)];
    [self addGestureRecognizer:tap];
}

直接移除手势

- (void) dismissView {
    [self.view removeGestureRecognizer:tap];
}

Objective-c相关问答推荐

单例实例与类方法

iphone 的 UIPopoverController 不工作?

如何在运行时向对象添加属性?

将 NSInteger 变量传递给 NSMutableDictionary 或 NSMutableArray

将 CSS 插入 UIWebView / WKWebView 中加载的 HTML

声明变量id和NSObject *有什么区别?

UIScreen MainScreen Bounds 返回错误的大小

如何以编程方式退出 mac 应用程序?

从我在 iPhone 上的应用程序调用官方 *Settings* 应用程序

检测设备是否支持电话?

UIViewController 的 prefersStatusBarHidden 不起作用

首次提交应用内购买以供审核

Electron邮件镇静 iOS 8

iPhone 键盘、完成按钮和 resignFirstResponder

Objective C 中的调用方法或发送消息

如何查看 NSError?

在 UITextField 文本上投影

UICollectionView 更新单个单元格

在 UITableView 中更改复选标记的 colored颜色

如何实现全局 iPhone 异常处理?