2011-02-25 1 views
0

내 문제는 내 textView가 실행 취소/다시 실행 작업을 수행 할 수 있도록하는 것입니다.이 작업에는 두 개의 버튼을 사용합니다. UITextView에는 내장 된 undoManager가 있으며 그의 기본적인 사용법은 정말 간단하다는 것을 발견 한 문서를 읽습니다. 나는 지금까지 무엇을 했는가?일부 텍스트가 textView에 추가되면 iOS -NSUndoManager가 작동을 멈 춥니 다.

나는 textView를 포함하는 viewController (EditorViewController)를 가지고있다. EditorViewController.m에서

 NSUndoManager *myUndoManager; 

EditorViewcontroller.h

에서

-> viewDidLoad에

myUndoManager = [textView undoManager]; 

내가 도스 두 개의 버튼에있는 두 개의 버튼은 작업을/취소를 수행 다시 실행하는 데 사용됩니다 말했듯 textView의 inputAccessoryView,이 뷰는 기본적으로 textView에 텍스트를 추가하는 데 사용되는 여러 버튼이있는 툴바입니다.

나는에서는 AppendText라는 메소드했습니다 : 나는 키보드를 사용하여 작성하는 경우

- (IBAction) appendText:(id)sender{ 

    NSString *contentsToAdd; 
    NSMutableString *textViewContent; 
    NSRange cursorPosition; 
    if ([undoManager canUndo]) { 
     NSLog(@"yes canundo"); 
    } 
    switch ([sender tag]) { 
     case 0: 
     [textView setScrollEnabled:NO]; 
     contentsToAdd = @"[]"; 
     cursorPosition = [textView selectedRange]; 

     textViewContent = [[NSMutableString alloc] 
          initWithString:[textView text]]; 

     [textViewContent insertString:contentsToAdd 
             atIndex:cursorPosition.location]; 

     [textView setText:textViewContent]; 

     [textViewContent release]; 
     cursorPosition.location++; 
     textView.selectedRange=cursorPosition; 

     [textView becomeFirstResponder]; 
     [textView setScrollEnabled:YES]; 
     if (![undoManager canUndo]) { 
      NSLog(@" can't undo"); 
     } 
     break; 
     // more case following 0..9 
     case 10: 
     [myUndoManager undo]; 
     [break]; 
     case 11 : 
     [myUndoManager redo]; 
     break; 
} 

지금 일이 잘 작동을, 나는 취소하고 올바르게 작동을 다시 실행 의미. 그러나 appendText : 메서드를 사용하여 텍스트를 추가 할 때 실행 취소 및 다시 실행이 수행되지 않습니다. 키보드 실행 취소를 사용하여 다시 쓰기 시작하고 다시 실행이 수행됩니다 (실행 취소 스택의 첫 번째 요소는 마지막 텍스트로 작성 됨). 실행 취소 및 다시 실행 스택은 텍스트를 추가 할 때마다 지워집니다. 누군가가 나에게 힌트를 줄 수 있기를 바랍니다.

답변

0

실행 취소 관리자가 실행 취소 할 때 수행 할 작업을 알려야합니다. 이 실행 취소 기능에서 변경 사항을 다시 실행하는 방법을 알려줍니다.

나는 파멸에 대해 다음 함수를 사용

- (void) undoText:(NSString*)text range:(NSRange)range { 
    [[textView.undoManager prepareWithInvocationTarget:self] undoText:[NSString stringWithString:c textView.text] range:textView.selectedRange]; 
    textView.text = text; 
    textView.selectedRange = range; 
} 

당신에서는 AppendText 기능 내에서 그런 다음 그것의 상단에 다음과 같은 것을 할 필요가 :

[[textView.undoManager prepareWithInvocationTarget:self] undoText:[NSString stringWithString:textView.text] range:textView.selectedRange]; 
[textView.undoManager setActionName:@"name to appear in undo"];