UIGestureRecognizer 目标问题

Posted

技术标签:

【中文标题】UIGestureRecognizer 目标问题【英文标题】:UIGestureRecognizer target issue 【发布时间】:2012-08-08 12:46:19 【问题描述】:

我有一个关于 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”

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

【问题讨论】:

上面的代码没有问题。你必须扩大你的搜索范围。在handleLongPressFromSender 中放置一个断点并确保它被调用(如果没有,WordSelection 对象是否超出范围并被释放?或者你是否输入了错误的方法名称?或者那个方法只需要一个参数没有正确的参数类型?)。如果它被调用,则再次扩大搜索范围并查看您的 WordSelectionDelegate 定义并确保您没有问题。 【参考方案1】:

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

例如,假设这个类的名称是 MyTextViewHandler,假设您有一个 viewDidLoad 用于某些具有以下内容的视图控制器:

- (void)viewDidLoad

    [super viewDidLoad];

    // do a bunch of initialization

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

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

【讨论】:

以上是关于UIGestureRecognizer 目标问题的主要内容,如果未能解决你的问题,请参考以下文章

点击按钮时取消 UIGestureRecognizer?

UIGestureRecognizer 问题

UIGestureRecognizer 从头开始​​制作 UISlider

如何用 UIGestureRecognizer 替换 TouchesBegan

UITableViewCell 内的 UIView 上的 UIGestureRecognizer

`UIGestureRecognizer`命中测试