Undo/redo with a UITextView (iOS/iPHone)

后端 未结 3 1797
逝去的感伤
逝去的感伤 2020-12-15 01:49

I have a view where a UITextView always has focus. What I want to do is extend the built-in undo/redo behavior to support undo/redo for when I programmatically set the text

相关标签:
3条回答
  • 2020-12-15 02:18

    OK, figured it out:

    The issue with #1 is as outlined in the update to my original post.

    Issues #2 and #3 were just me using the NSUndoManager incorrectly. My final unClear method (which gets called on undos is as follows:

    -(void)undoClear:(NSString *)textToRestore
    {   
        NSString *textBackup = [self.myTextView.text copy];
    
        self.myTextView.text = textToRestore;
    
        if ([self.myTextView.undoManager isUndoing])
        {
            // Prepare the redo.
            [[self.myTextView.undoManager prepareWithInvocationTarget:self] undoClear:@""];     
        }
        else if ([self.myTextView.undoManager isRedoing])
        {
            [[self.myTextView.undoManager prepareWithInvocationTarget:self] undoClear:textBackup];
        }
    
        [textBackup release];
    }

    It's working as it should now.

    0 讨论(0)
  • 2020-12-15 02:33

    I'm not sue how many Text Fields you are working with, though textBackup is not getting retained by prepareWithInvocationTarget: How is it still in the Undo Stack several clear's later? Seems like it might still be there after the first one, though not after the 2nd one or after the Autorelease pool flushes.

    0 讨论(0)
  • 2020-12-15 02:38

    You can change your textview to whatever text you want and preserve undo and redo manager's memory stacks. self.content is UITextView.

    -(void) yourClearAllButtonIsPressed
    {
        [[self.content.undoManager prepareWithInvocationTarget:self] undoClear:self.content.text];
        [self.content setText:@""];//Or something else you want to change your textview to
    }
    
    }
    

    //just one, my method I created

    -(void) undoClearBlablabla:(NSString*) text
        {
            [[self.content.undoManager prepareWithInvocationTarget:self] undoClear:self.content.text];
            [self.content setText:text];
        }
    
    0 讨论(0)
提交回复
热议问题