ios - NSUndoManager only Undo, not Redo -
i write simple undo , redo alter background color base of operations on sample code of nsundomanager. things work undo action. redo, not jump register method nsundomanager registed before. follow code:
#import "viewcontroller.h" enum color {kwhite = 0, kred, korange, kyellow, kgreen, kcyan, kblue, kmagenta}; @interface viewcontroller (){ enum color kcolor; nsarray * colorarr; nsundomanager * undomanager; } - (ibaction)changecolor:(id)sender; - (ibaction)undo:(id)sender; - (ibaction)redo:(id)sender; @end @implementation viewcontroller - (void)viewdidload { [super viewdidload]; // additional setup after loading view, typically nib.] kcolor = kwhite; colorarr = [nsarray arraywithobjects:[uicolor whitecolor], [uicolor redcolor], [uicolor orangecolor], [uicolor yellowcolor], [uicolor greencolor], [uicolor cyancolor], [uicolor bluecolor], [uicolor magentacolor], nil]; undomanager = [[nsundomanager alloc] init]; undomanager.levelsofundo = 7; nsnotificationcenter * nc = [nsnotificationcenter defaultcenter]; [nc addobserver:self selector:@selector(undomanagerdidundo:) name:nsundomanagerdidundochangenotification object:self.undomanager]; [nc addobserver:self selector:@selector(undomanagerdidredo:) name:nsundomanagerdidredochangenotification object:self.undomanager]; } - (void)didreceivememorywarning { [super didreceivememorywarning]; // dispose of resources can recreated. } - (ibaction)changecolor:(id)sender { [[undomanager preparewithinvocationtarget:self] setcolor:kcolor]; kcolor ++; if(kcolor > kmagenta) kcolor = kwhite; [self.view setbackgroundcolor:colorarr[kcolor]]; } -(void) setcolor:(enum color) color{ kcolor = color; [self.view setbackgroundcolor:colorarr[kcolor]]; nslog(@"zzzz %d", color); }; - (ibaction)undo:(id)sender { [undomanager undo]; } - (ibaction)redo:(id)sender { [undomanager redo]; } #pragma mark - undo back upwards // ------------------------------------------------------------------------------- // undomanagerdidundo: // handler nsundomanagerdidundochangenotification. redisplays table // view reflect changed value. // see also: -setediting:animated: // ------------------------------------------------------------------------------- - (void)undomanagerdidundo:(nsnotification *)notification { //[self.view setbackgroundcolor:colorarr[kcolor]]; } // ------------------------------------------------------------------------------- // undomanagerdidredo: // handler nsundomanagerdidredochangenotification. redisplays table // view reflect changed value. // see also: -setediting:animated: // ------------------------------------------------------------------------------- - (void)undomanagerdidredo:(nsnotification *)notification { //[self.view setbackgroundcolor:colorarr[kcolor]]; } @end
// // viewcontroller.m // undomanager // // created eugene buleyko on 01.08.14. // copyright (c) 2014 eugene buleyko. rights reserved. // #import "viewcontroller.h" enum color {kwhite = 0, kred, korange, kyellow, kgreen, kcyan, kblue, kmagenta}; @interface viewcontroller () { enum color kcolor; nsarray * colorarr; nsundomanager * undomanager; } - (ibaction)changecolor:(id)sender; - (ibaction)undo:(id)sender; - (ibaction)redo:(id)sender; @end @implementation viewcontroller @synthesize buttonredo, buttonundo; - (void)viewdidload { [super viewdidload]; kcolor = kwhite; colorarr = [nsarray arraywithobjects:[uicolor whitecolor], [uicolor redcolor], [uicolor orangecolor], [uicolor yellowcolor], [uicolor greencolor], [uicolor cyancolor], [uicolor bluecolor], [uicolor magentacolor], nil]; undomanager = [[nsundomanager alloc] init]; undomanager.levelsofundo = 9; nsnotificationcenter * nc = [nsnotificationcenter defaultcenter]; [nc addobserver:self selector:@selector(undomanagerdidundo:) name:nsundomanagerdidundochangenotification object:self.undomanager]; [nc addobserver:self selector:@selector(undomanagerdidredo:) name:nsundomanagerdidredochangenotification object:self.undomanager]; [self setcolor:kcolor]; } - (void)didreceivememorywarning { [super didreceivememorywarning]; } - (ibaction)changecolor:(id)sender { kcolor ++; if (kcolor > kmagenta) { kcolor = kwhite; } [self setcolor:kcolor]; [self.view setbackgroundcolor:colorarr[kcolor]]; } -(void) setcolor:(enum color) color{ // if ([self.view backgroundcolor] == colorarr[color]) { // nslog(@"=="); // // } else { // nslog(@"!="); // } kcolor = color; [[undomanager preparewithinvocationtarget:self] setcolor:kcolor]; //[undomanager setactionname:@"add"]; }; - (ibaction)undo:(id)sender { [undomanager undo]; } - (ibaction)redo:(id)sender { [undomanager redo]; } #pragma mark - undo back upwards - (void)undomanagerdidundo:(nsnotification *)notification { [self.view setbackgroundcolor:colorarr[kcolor]]; if (![undomanager canundo]) self.buttonundo.enabled = no; if ([undomanager canredo]) self.buttonredo.enabled = yes; } - (void)undomanagerdidredo:(nsnotification *)notification { [self.view setbackgroundcolor:colorarr[kcolor]]; if (![undomanager canredo]) self.buttonredo.enabled = no; if ([undomanager canundo]) self.buttonundo.enabled = yes; } @end
ios objective-c
No comments:
Post a Comment