1

私が欲しいのは、私のiPhoneアプリが震えるジェスチャーを常に認識していることUITextfieldですUITextview

(私はこれに従いました: https://stackoverflow.com/questions/150446/how-do-i-detect-when-someone-shakes-an-iphone/1351486#1351486I )

メソッドをサブクラス化UIWindowして実装しましたが、aを firstRespondermotionEnded:withEvent:に設定しても機能します。firstResponder でなくても、UITextViewカスタムUIWindowコールを呼び出します。motionEnded:withEvent:

問題は、私UItextViewのデフォルトの元に戻すマネージャーが揺れに反応しなくなったことです。ビュー階層または firstResponders がどのように変更されたかに関係なく、 は Shake-Gesture のすべてのUIWindow処理を引き継ぎます。

UIWindow の検出を一時的に無効にする方法や、実装に基づいて現在の firstResponder が Shaking-Gesture を引き継ぐ方法について、誰かが光を当てることができますか?

前もって感謝します!

4

1 に答える 1

1

とにかく解決策を見つけました。

デフォルトの元に戻すマネージャーは、実際にはまだ残っており、UITextView に対して行われたすべてのアクションを密かに保存しています。

UIWindowモーション処理を引き継ぐので、最初にmotionEnded:withEvent:、自分のUITextView.

次に、それまでに undoManager を取得して、メッセージを[myTextView undoManager]送信できるようにします。undoredo

デフォルトの undo manager アラートビューを模倣するには、 と を使用redoMenuItemTitleundoMenuItemTitleてボタンのタイトルを取得し、と を使用canUndocanRedoてボタンを表示するかどうかを決定します。

編集:これが私のアプリケーションのコードです:

- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event {
    if (event.type == UIEventTypeMotion && event.subtype == UIEventSubtypeMotionShake) {

        //textUndoManager is an ivar but it was just a reference to the undoManager
        //textUndoManager = [myTextView undoManager]; <--- in viewDidLoad:
        NSString *undoButtonTitle = nil;
        NSString *redodoButtonTitle = nil;
        NSString *alertViewTitle = nil;
        if ([textUndoManager canUndo])
            undoButtonTitle = [NSString stringWithString:[textUndoManager undoMenuItemTitle]];
        if ([textUndoManager canRedo])
            redodoButtonTitle = [NSString stringWithString:[textUndoManager redoMenuItemTitle]];
        if (!undoButtonTitle && !redodoButtonTitle)
            alertViewTitle = @"Nothing to Undo";

        UIAlertView *alertView;
        if (undoButtonTitle == nil) {
            alertView = [[UIAlertView alloc] initWithTitle:alertViewTitle message:nil delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:redodoButtonTitle, nil];
        } else {
            alertView = [[UIAlertView alloc] initWithTitle:alertViewTitle message:nil delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:undoButtonTitle, redodoButtonTitle, nil];
        }

        [alertView show];
    }
}

//UIAlertViewDelegate
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
    if ([[alertView buttonTitleAtIndex:buttonIndex] isEqualToString:[textUndoManager undoMenuItemTitle]]) {
        [textUndoManager undo];
    }
    if ([[alertView buttonTitleAtIndex:buttonIndex] isEqualToString:[textUndoManager redoMenuItemTitle]]) {
        [textUndoManager redo];
    }
}
于 2010-08-13T13:09:23.597 に答える