我对UIGestureRecognizer有一个奇怪的问题
我创建了一个类,我声明了手势识别器,并将self作为目标
-(id)initWithTextView:(UITextView*)theTextView withDelegate:(id<WordSelectionDelegate>)theDelegate
{
if (self = [super init])
{
delegate = theDelegate;
textView = theTextView;
// init long press gesture to detect pressing on text elements
UILongPressGestureRecognizer *longPressGesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongPressFromSender:)];
[textView addGestureRecognizer:longPressGesture];
}
return self;
}
但诀窍是当我实际做长按手势时,我有下一个错误:
* 由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:' - [NSConcreteMutableAttributedString handleLongPressFromSender:]:无法识别的选择器发送到实例0x76227b0'
为什么自己的消息会转到String ???
答案 0 :(得分:2)
顺便说一句,问题无疑是具有handleLongPressFromSender
实例方法的对象(即用initWithTextView
初始化的对象)在{{{{{}}之前超出范围1}}被调用。您需要检查该对象的范围。
例如,假设此类的名称为UILongPressGestureRecognizer
,假设某个视图控制器有一个MyTextViewHandler
,其中包含:{/ p>
viewDidLoad
如果你在ARC项目中做了类似的事情,你会得到你描述的崩溃(因为- (void)viewDidLoad
{
[super viewDidLoad];
// do a bunch of initialization
MyTextViewHandler *textViewDelegate = [[MyTextViewHandler alloc] initWithTextView:self.textview withDelegate:self];
}
对象是textViewDelegate
的本地对象,并且会在结束时超出范围那个方法)。如果将此委托处理程序类作为视图控制器的实例变量(或属性),则此问题就会消失。