1

UIGestureRecognizer に奇妙な問題があります

ジェスチャ認識エンジンを宣言するクラスを作成し、自分自身をターゲットとして配置しました

-(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そのオブジェクトのスコープを確認する必要があります。

たとえば、このクラスの名前が であると仮定すると、次のようなビュー コントローラーがあったとしますMyTextViewHandlerviewDidLoad

- (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 に答える