ios NSUndoManager textView 撤销 反撤销

#import "ViewController.h"

@interface CCTextObjc : NSObject
@property(nonatomic,copy) NSString *text;
@property(nonatomic,assign) NSUInteger op;
@property(nonatomic,assign) NSRange range;
@property(nonatomic,copy) NSString *textViewText;

@end

@interface ViewController ()<UITextViewDelegate>{
    NSUndoManager *_undomanager;
    NSInteger _length;
    NSRange rg;
    NSString *currentText;
    NSString *addText;
}
- (IBAction)chexiao:(id)sender;
- (IBAction)fanchexiao:(id)sender;
@property (weak, nonatomic) IBOutlet UITextView *text;
@property (weak, nonatomic) IBOutlet UIButton *cheBtn;
@property (weak, nonatomic) IBOutlet UIButton *fanBtn;

@property(nonatomic,copy) NSString *useTitle;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.text.delegate = self;
    _length =0;
    //初始化NSUndoManager
    _undomanager = [[NSUndoManager alloc] init];
    
    //监听textview文本改动的通知
    [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(changeTextViewText) name:UITextViewTextDidChangeNotification object:nil];
//    [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(keyBoardShow:) name:UIKeyboardWillShowNotification object:nil];
//    [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(keyBoardHidden:) name:UIKeyboardWillHideNotification object:nil];
}
- (IBAction)fanchexiao:(id)sender {
    [self redoitem];
}

- (IBAction)chexiao:(id)sender {
    [self undoitem];
}

-(void)redoitem{
    //反撤销
    [_undomanager redo];
}

-(void)undoitem{
    //撤销
    [_undomanager undo];
}


-(void)keyBoardShow:(NSNotification *)noti{

    NSDictionary *dic = noti.userInfo;

    NSValue *aValue = [dic objectForKey:UIKeyboardFrameEndUserInfoKey];
    CGRect keyboardRect = [aValue CGRectValue];
    int height = keyboardRect.size.height;
    [_text setContentInset:UIEdgeInsetsMake(0,0, height, 0)];

}


-(void)keyBoardHidden:(NSNotification *)noti{
    [_text setContentInset:UIEdgeInsetsMake(0,0, 0,0)];
}

- (void)setMyObjectTitle:(CCTextObjc *)obj{
//    NSString *newTitle = obj.text;
    //判断当前NSUndoManager的状态,是处于撤销或者反撤销的状态
    if (_undomanager.isUndoing) {
        if (_text.text.length>0) {
           //获取
            NSMutableString *tt = [[NSMutableString alloc] initWithString:obj.textViewText];
            [tt replaceCharactersInRange:obj.range withString:@""];
            _text.text = [NSString stringWithFormat:@"%@",tt];
            [_undomanager registerUndoWithTarget:self

                                        selector:@selector(setMyObjectTitle:)

                                          object:obj];
        }

    }else if (_undomanager.isRedoing){
        _text.text = obj.textViewText;
        [_undomanager registerUndoWithTarget:self

                                    selector:@selector(setMyObjectTitle:)

                                      object:obj];
    }else{

//        NSString *currentText = obj.textViewText;
//        if (newTitle != currentText) {
//            _text.text = currentText;
//
//        }else{
//            _text.text = newTitle;
//
//        }
        [_undomanager registerUndoWithTarget:self
                                    selector:@selector(setMyObjectTitle:)
                                      object:obj];
    }
}
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text{
    rg = range;
    currentText = textView.text;
    addText = text;
    return  YES;
}

-(void)changeTextViewText{

    if (_text.text.length>0) {
        _cheBtn.enabled =YES;
    }else{
        _cheBtn.enabled =NO;
        _fanBtn.enabled =NO;
    }

//    NSString *text ;
//    if (_length !=0) {
//        NSInteger textLength =_text.text.length;
//        if (textLength >_length) {
//            NSInteger newLength = textLength -_length;
//            text = [NSString stringWithFormat:@"%@",[_text.text substringWithRange:NSMakeRange(_length, newLength)]];
//        }else{
//            text = _text.text;
//        }
//    }else{
//        text = _text.text;
//    }
    _length =_text.text.length;
    CCTextObjc *obj = [[CCTextObjc alloc] init];
    obj.text = addText;
    obj.textViewText = currentText;
    obj.range = rg;
    obj.op = obj.range.location;
    [self setMyObjectTitle:obj];
}

@end

@implementation CCTextObjc

@end
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容