UIGestureRecognizer目标问题

时间:2012-08-08 12:46:20

标签: ios uigesturerecognizer

我对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 ???

1 个答案:

答案 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的本地对象,并且会在结束时超出范围那个方法)。如果将此委托处理程序类作为视图控制器的实例变量(或属性),则此问题就会消失。