Обнаружение встряхивания Жест в подклассе UIWindow принимает по умолчанию менеджер отмены текста - PullRequest
1 голос
/ 13 августа 2010

То, что я хочу, - это чтобы приложение для iPhone все время осознавало, что любой жест UITextfield или UITextview становится firstResponder.

(Я следовал этому: /71112/kak-opredelit-kogda-kto-to-tryaset-iphone#71124I)

Я подкласс UIWindow и внедрил метод motionEnded:withEvent:, и он работает, даже если я установил UITextView в качестве firstResponder. Мой пользовательский UIWindow вызывает motionEnded:withEvent:, даже если это не firstResponder.

Так чтопроблема в том, что мой менеджер отмены по умолчанию UItextView больше не отвечает на встряхивание. UIWindow берет на себя всю обработку Shake-Gesture независимо от того, как изменилась иерархия представления или firstResponders.

Может ли кто-нибудь пролить свет на то, как временно отключить обнаружение UIWindow, или чтобы текущий firstResponder принял Shaking-Gesture на основе реализации, которую я имею? *

Заранее спасибо!

1 Ответ

1 голос
/ 13 августа 2010

В любом случае, я нашел решение.

Менеджер отмены по умолчанию на самом деле все еще там, сохраняя все действия, сделанные в UITextView в тайне.

Поскольку UIWindow берет на себя обработку движения, сначала я пытаюсь вернуть его, переопределив motionEnded:withEvent: в viewController, который содержит мой UITextView.

Во-вторых, получите undoManager по [myTextView undoManager], тогда вы можете отправлять ему undo или redo сообщения.

Теперь, чтобы имитировать просмотр предупреждений менеджера отмены по умолчанию, используйте redoMenuItemTitle и undoMenuItemTitle, чтобы получить заголовок кнопки, затем используйте canUndo и canRedo, чтобы решить, показывать кнопку или нет.

Редактировать : Вот код из моего приложения:

- (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];
    }
}
...