【问题标题】:iOS- UITapGestureRecognizer Gives EXC_BAD_ACCESSiOS- UITapGestureRecognizer 提供 EXC_BAD_ACCESS
【发布时间】:2014-03-07 14:46:20
【问题描述】:

我想在我的自定义标题类中添加点击事件。 以下是我的代码。当我单击标题区域时,它会给出 EXC_BAD_ACCESS。

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{

    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        UITapGestureRecognizer *singleFingerTap =
        [[UITapGestureRecognizer alloc] initWithTarget:self
                                                action:@selector(handleSingleTap:)];
        [self.view addGestureRecognizer:singleFingerTap];

    }

    return self;
}

- (void)handleSingleTap:(UITapGestureRecognizer *)recognizer {
    CGPoint location = [recognizer locationInView:[recognizer.view superview]];

    //Do stuff here...
}
- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

【问题讨论】:

  • 尝试在viewDidLoad中进行分配代码。超后
  • 获取 [_UIScrollViewAutomaticContentSizeConstraint handleSingleTap:]:在 viewdidload 中发送到实例 0x8c70800 时无法识别的选择器

标签: ios objective-c exc-bad-access


【解决方案1】:
//At View did load
UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapDetected:)];
    tapRecognizer.numberOfTapsRequired = 1;
    [self.view addGestureRecognizer:tapRecognizer];

- (void)tapDetected:(UITapGestureRecognizer *)tapRecognizer
{
   //addcodehere
}

【讨论】:

    【解决方案2】:

    如果您的自定义标头类是UIView 的子类,则使用self 而不是self.view

    UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)];
    tapRecognizer.numberOfTapsRequired = 1;
    
    [self.view addGestureRecognizer:tapRecognizer];
    
    - (void)handleSingleTap:(UITapGestureRecognizer *)recognizer {
        CGPoint location = [recognizer locationInView:[recognizer.view superview]];
    
    //Do stuff here...
    }
    

    【讨论】:

    • 应用程序没有进入handleSingleTap函数。
    • 添加视图中的代码确实加载了,并且您还为 self.view 设置了用户交互
    • 如果您的自定义标题类是 UIView 子类,则意味着使用 self 而不是 self.view
    • 其实这是一个视图控制器。我想在它的视图中添加一个点击手势。我将它用作 UITable 视图标题。
    • 你为什么要为 UIViewController 类添加子视图。你可以使用 UIView 本身
    【解决方案3】:

    也许这对你有帮助......

     {
        UITapGestureRecognizer *tapGestureRecognizer;
        self.view.backgroundColor = [UIColor whiteColor];
        /* Create the Tap Gesture Recognizer */
        self.tapGestureRecognizer = [[UITapGestureRecognizer alloc]
                                     initWithTarget:self action:@selector(handleTaps:)];
       self.tapGestureRecognizer.numberOfTouchesRequired = 2;
    
        self.tapGestureRecognizer.numberOfTapsRequired = 3;
        [self.view addGestureRecognizer:self.tapGestureRecognizer];
    }
    - (void) handleTaps:(UITapGestureRecognizer*)paramSender
    {
        NSUInteger touchCounter = 0; for (touchCounter = 0;
                                          touchCounter < paramSender.numberOfTouchesRequired;
                                          touchCounter++)
        {
            CGPoint touchPoint =
            [paramSender locationOfTouch:touchCounter inView:paramSender.view];
            NSLog(@"Touch #%lu: %@",(unsigned long)touchCounter+1, NSStringFromCGPoint(touchPoint));
        }
    }
    

    【讨论】:

      【解决方案4】:

      尝试在 ViewDidLoad 中执行,而不是在 init 方法中执行。

      - (void)viewDidLoad
      { 
          [super viewDidLoad];
      
          UITapGestureRecognizer *singleFingerTap =
          [[UITapGestureRecognizer alloc] initWithTarget:self
                                                  action:@selector(handleSingleTap:)];
          [self.view addGestureRecognizer:singleFingerTap];
        // Do any additional setup after loading the view from its nib.
      }
      

      并将此方法包含在类扩展中,

      - (void)handleSingleTap:(UITapGestureRecognizer *)recognizer ;
      

      或者写在viewDidLoad之前。

      【讨论】:

      • 获取 [_UIScrollViewAutomaticContentSizeConstraint handleSingleTap:]:在 viewdidload 中发送到实例 0x8c70800 时无法识别的选择器
      • 包括在内。但注意到发生了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多