어쨌든 해결책을 찾았습니다.
기본적으로 실행 취소 관리자는 실제로 UITextView에 수행 한 모든 작업을 비밀리에 저장합니다.
UIWindow
은 모션 처리를 담당하므로 먼저 UITextView
이 포함 된 viewController에서 motionEnded:withEvent:
을 재정 의하여 다시 가져 오려고합니다.
두 번째로 [myTextView undoManager]
에 의해 undoManager를 가져온 다음 undo
또는 redo
메시지를 보낼 수 있습니다.
이제 기본 실행 취소 관리자 alertview을 모방하는 버튼을 표시할지 여부를 결정하는
canUndo
및
canRedo
을 사용 후, 버튼 타이틀을 얻기 위해
redoMenuItemTitle
및
undoMenuItemTitle
를 사용합니다.
편집는 :
- (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];
}
}
: 여기에 내 응용 프로그램의 코드입니다