1

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

为什么给自己的消息会转到字符串???

4

1 回答 1

2

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

例如,假设这个类的名字是MyTextViewHandler,假设你有一个viewDidLoadfor 一些视图控制器,它有类似的东西:

- (void)viewDidLoad
{
    [super viewDidLoad];

    // do a bunch of initialization

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

如果你在 ARC 项目中做了类似的事情,你会得到你描述的崩溃(因为该textViewDelegate对象是本地对象,viewDidLoad并且将在该方法结束时超出范围)。如果您将此委托处理程序类设为视图控制器的实例变量(或属性),那么此问题就会消失。

于 2012-10-07T15:04:03.460 回答