UITapGestureRecognizer
アクションが呼び出されるときに、常にクラッシュまたは例外 (認識されないセレクター) がスローされるという奇妙な問題があります。以前にジェスチャ認識機能を使用したことがありますが、今回UIView
は an のプロパティであるa にアタッチしていますNSObject
(また、オブジェクトのメソッドを使用してビューを構築しています)。以下は、私がやっていることの最小限の例です:
MyObject.h:
#import <Foundation/Foundation.h>
@interface MyObject : NSObject
@property (nonatomic, strong) UIView *aView;
- (void)createViewWithFrame:(CGRect)frame;
@end
MyObject.m:
@interface MyObject ()
- (void)tapped:(id)sender; // Non-specific id type for brevity
@end
@implementation MyObject
- (void)tapped:(id)sender {
NSLog(@"Tapped");
}
- (void)createViewWithFrame:(CGRect)frame {
_aView = [[UIView alloc] initWithFrame:frame];
self.aView.backgroundColor = [UIColor blueColor];
self.aView.userInteractionEnabled = YES;
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]
initWithTarget:self
action:@selector(tapped:)];
[self.aView addGestureRecognizer:tap];
}
ViewController.m:
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
MyObject *obj = [[MyObject alloc] init];
[obj createViewWithFrame:self.view.frame]; // Excuse poor frame - example only
[self.view addSubview:obj.aView];
}
次に、ビューをタップすると、アプリケーションがここでクラッシュします。
libobjc.A.dylib`objc_msgSend:
0x10e008c: movl 8(%esp), %ecx
0x10e0090: movl 4(%esp), %eax
0x10e0094: testl %eax, %eax
0x10e0096: je 0x10e00e8 ; objc_msgSend + 92
0x10e0098: movl (%eax), %edx
0x10e009a: pushl %edi
0x10e009b: movl 8(%edx), %edi ; Thread 1: EXC_BAD_ACCESS (code=2, address=0x9)
0x10e009e: pushl %esi
0x10e009f: movl (%edi), %esi
0x10e00a1: movl %ecx, %edx
正確なクラッシュ ポイントはさまざまで、無効なセレクタ エラーが発生することがあります。NSLog
当然のことながら、決して起こりません。以前にジェスチャ認識機能を使用したことがありますが (成功しました)、問題はセットアップ/設計にあると思います。この場合、ジェスチャ認識機能が正しく機能しない理由を誰か説明できますか?