Ios UIgestureRecognitor目标问题

Ios UIgestureRecognitor目标问题,ios,uigesturerecognizer,Ios,Uigesturerecognizer,我对UIGestureRecognitor有一个奇怪的问题 我创建了一个类,在其中声明手势识别器,并将self作为目标 -(id)initWithTextView:(UITextView*)text视图withDelegate:(id)delegate { if(self=[super init]) { 委派=委派; 文本视图=文本视图; //init long press手势用于检测文本元素上的按下 UILongPressGestureRecognitzer*LongPress手势=[[UI

我对UIGestureRecognitor有一个奇怪的问题

我创建了一个类,在其中声明手势识别器,并将self作为目标

-(id)initWithTextView:(UITextView*)text视图withDelegate:(id)delegate
{
if(self=[super init])
{
委派=委派;
文本视图=文本视图;
//init long press手势用于检测文本元素上的按下
UILongPressGestureRecognitzer*LongPress手势=[[UILongPressGestureRecognitzer alloc]初始化,目标:自我操作:@selector(handleLongPressFromSender:)];
[文本视图添加手势识别器:长按手势];
}
回归自我;
}

但诀窍是,当我实际做了一个长按手势时,我会出现下一个错误:

*由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[nsConcreteMatableAttributedString handleLongPressFromSender:]:无法识别的选择器已发送到实例0x76227b0”


为什么发送给self的消息会变成字符串?

顺便说一句,问题无疑是具有
handleLongPressFromSender
实例方法的对象(即您正在使用
initWithTextView
初始化的对象)在调用
UILongPressGestureRecognitizer
时已超出范围。您需要检查该对象的范围

例如,假设该类的名称为
MyTextViewHandler
,则假设您有一个
viewdiload
用于某个视图控制器,该视图控制器具有如下内容:


如果在ARC project中执行类似操作,您将得到所描述的崩溃(因为
textViewDelegate
对象是
viewDidLoad
的本地对象,并且在该方法结束时将不在范围内)。如果将此委托处理程序类作为视图控制器的实例变量(或属性),则此问题将消失。

上述代码没有任何错误。你必须扩大你的搜索范围。在
handleLongPressFromSender
中放置一个断点,并确保调用了该断点(如果没有,则
WordSelection
对象是否超出范围并被释放?或者您是否键入了错误的方法名称?或者仅使用一个参数的方法是否没有正确的参数类型?)。如果它被调用,则再次扩大搜索范围,查看您的
WordSelectionDelegate
定义,确保没有问题。

-(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;
}
- (void)viewDidLoad
{
    [super viewDidLoad];

    // do a bunch of initialization

    MyTextViewHandler *textViewDelegate = [[MyTextViewHandler alloc] initWithTextView:self.textview withDelegate:self];
}