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 从头开始制作 UISlider
如何用 UIGestureRecognizer 替换 TouchesBegan