IOS设计模式之四(备忘录模式,命令模式)
- - (void)saveCurrentState
- {
- // When the user leaves the app and then comes back again, he wants it to be in the exact same state
- // he left it. In order to do this we need to save the currently displayed album.
- // Since it's only one piece of information we can use NSUserDefaults.
- [[NSUserDefaultsstandardUserDefaults] setInteger:currentAlbumIndex forKey:@"currentAlbumIndex"];
- }
- - (void)loadPreviousState
- {
- currentAlbumIndex = [[NSUserDefaultsstandardUserDefaults] integerForKey:@"currentAlbumIndex"];
- [self showDataForAlbumAtIndex:currentAlbumIndex];
- }
- [self loadPreviousState];
- [[NSNotificationCenterdefaultCenter] addObserver:self selector:@selector(saveCurrentState) name:UIApplicationDidEnterBackgroundNotification object:nil];
- - (void)dealloc
- {
- [[NSNotificationCenterdefaultCenter] removeObserver:self];
- }

- - (NSInteger)initialViewIndexForHorizontalScroller:(HorizontalScroller *)scroller
- {
- return currentAlbumIndex;
- }

- @interfaceAlbum : NSObject<NSCoding>
- - (void)encodeWithCoder:(NSCoder *)aCoder
- {
- [aCoder encodeObject:self.year forKey:@"year"];
- [aCoder encodeObject:self.title forKey:@"album"];
- [aCoder encodeObject:self.artist forKey:@"artist"];
- [aCoder encodeObject:self.coverUrl forKey:@"cover_url"];
- [aCoder encodeObject:self.genre forKey:@"genre"];
- }
- - (id)initWithCoder:(NSCoder *)aDecoder
- {
- self = [super init];
- if (self)
- {
- _year = [aDecoder decodeObjectForKey:@"year"];
- _title = [aDecoder decodeObjectForKey:@"album"];
- _artist = [aDecoder decodeObjectForKey:@"artist"];
- _coverUrl = [aDecoder decodeObjectForKey:@"cover_url"];
- _genre = [aDecoder decodeObjectForKey:@"genre"];
- }
- return self;
- }
- - (void)saveAlbums;
- - (void)saveAlbums
- {
- NSString *filename = [NSHomeDirectory() stringByAppendingString:@"/Documents/albums.bin"];
- NSData *data = [NSKeyedArchiverarchivedDataWithRootObject:albums];
- [data writeToFile:filename atomically:YES];
- }
- - (id)init
- {
- self = [super init];
- if (self) {
- NSData *data = [NSDatadataWithContentsOfFile:[NSHomeDirectory() stringByAppendingString:@"/Documents/albums.bin"]];
- albums = [NSKeyedUnarchiverunarchiveObjectWithData:data];
- if (albums == nil)
- {
- albums = [NSMutableArrayarrayWithArray:
- @[[[Album alloc] initWithTitle:@"Best of Bowie" artist:@"David Bowie" coverUrl:@"http://www.coversproject.com/static/thumbs/album/album_david%20bowie_best%20of%20bowie.png" year:@"1992"],
- [[Album alloc] initWithTitle:@"It's My Life" artist:@"No Doubt" coverUrl:@"http://www.coversproject.com/static/thumbs/album/album_no%20doubt_its%20my%20life%20%20bathwater.png" year:@"2003"],
- [[Album alloc] initWithTitle:@"Nothing Like The Sun" artist:@"Sting" coverUrl:@"http://www.coversproject.com/static/thumbs/album/album_sting_nothing%20like%20the%20sun.png" year:@"1999"],
- [[Album alloc] initWithTitle:@"Staring at the Sun" artist:@"U2" coverUrl:@"http://www.coversproject.com/static/thumbs/album/album_u2_staring%20at%20the%20sun.png" year:@"2000"],
- [[Album alloc] initWithTitle:@"American Pie" artist:@"Madonna" coverUrl:@"http://www.coversproject.com/static/thumbs/album/album_madonna_american%20pie.png" year:@"2000"]]];
- [self saveAlbums];
- }
- }
- return self;
- }
- - (void)saveAlbums;
- - (void)saveAlbums
- {
- [persistencyManager saveAlbums];
- }
- [[LibraryAPI sharedInstance] saveAlbums];
命令模式
- UIToolbar *toolbar;
- // We will use this array as a stack to push and pop operation for the undo option
- NSMutableArray *undoStack;
- toolbar = [[UIToolbar alloc] init];
- UIBarButtonItem *undoItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemUndo target:self action:@selector(undoAction)];
- undoItem.enabled = NO;
- UIBarButtonItem *space = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
- UIBarButtonItem *delete = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemTrash target:self action:@selector(deleteAlbum)];
- [toolbar setItems:@[undoItem,space,delete]];
- [self.view addSubview:toolbar];
- undoStack = [[NSMutableArrayalloc] init];
- - (void)viewWillLayoutSubviews
- {
- toolbar.frame = CGRectMake(0, self.view.frame.size.height-44, self.view.frame.size.width, 44);
- dataTable.frame = CGRectMake(0, 130, self.view.frame.size.width, self.view.frame.size.height - 200);
- }
- - (void)addAlbum:(Album*)album atIndex:(int)index
- {
- [[LibraryAPI sharedInstance] addAlbum:album atIndex:index];
- currentAlbumIndex = index;
- [self reloadScroller];
- }
- - (void)deleteAlbum
- {
- // 1
- Album *deletedAlbum = allAlbums[currentAlbumIndex];
- // 2
- NSMethodSignature *sig = [self methodSignatureForSelector:@selector(addAlbum:atIndex:)];
- NSInvocation *undoAction = [NSInvocationinvocationWithMethodSignature:sig];
- [undoAction setTarget:self];
- [undoAction setSelector:@selector(addAlbum:atIndex:)];
- [undoAction setArgument:&deletedAlbum atIndex:2];
- [undoAction setArgument:¤tAlbumIndex atIndex:3];
- [undoAction retainArguments];
- // 3
- [undoStack addObject:undoAction];
- // 4
- [[LibraryAPI sharedInstance] deleteAlbumAtIndex:currentAlbumIndex];
- [self reloadScroller];
- // 5
- [toolbar.items[0] setEnabled:YES];
- }
- - (void)undoAction
- {
- if (undoStack.count > 0)
- {
- NSInvocation *undoAction = [undoStack lastObject];
- [undoStack removeLastObject];
- [undoAction invoke];
- }
- if (undoStack.count == 0)
- {
- [toolbar.items[0] setEnabled:NO];
- }
- }

IOS设计模式之四(备忘录模式,命令模式)的更多相关文章
- Java设计模式(22)命令模式(Command模式)
Command模式是最让我疑惑的一个模式,我在阅读了很多代码后,才感觉隐约掌握其大概原理,我认为理解设计模式最主要是掌握起原理构造,这样才对自己实际编程有指导作用.Command模式实际上不是个很具体 ...
- javascript设计模式详解之命令模式
每种设计模式的出现都是为了弥补语言在某方面的不足,解决特定环境下的问题.思想是相通的.只不过不同的设计语言有其特定的实现.对javascript这种动态语言来说,弱类型的特性,与生俱来的多态性,导致某 ...
- C#设计模式之11:命令模式
C#设计模式之11:命令模式 命令模式 命令模式用来解决一些复杂业务逻辑的时候会很有用,比如,你的一个方法中到处充斥着if else 这种结构的时候,用命令模式来解决这种问题就会让事情变得简单很多. ...
- JS设计模式(6)命令模式
什么是命令模式? 定义:将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化. 主要解决:在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场合,比如需要对行为进行记录. ...
- vim 的编辑模式 命令模式
1.vim的编辑模式 进入编辑模式 按键: a i o a: 表示在光标当前的,后面开始插入,写数据 i : 则表示 前面 . o : 表面在光标当前的,下一行开始写入数据. O : 大写的 ...
- iOS设计模式之备忘录模式
备忘录模式 基本理解 这个模式有三个关键角色:原发器(Originator).备忘录(Memento).看管人(caretaker).三者的基本关系是:原发器创建一个包含其状态的备忘录,并传给看管人. ...
- 《Android源码设计模式》--状态模式--责任链模式--解释器模式--命令模式--观察者模式--备忘录模式--迭代器模式
[状态模式] No1: Wifi设置界面是一个叫做WifiSetting的Fragment实现的 No2: 在不同的状态下对于扫描Wifi这个请求的处理是完全不一样的.在初始状态下扫描请求被直接忽略, ...
- C#设计模式之十五命令模式(Command Pattern)【行为型】
一.引言 今天我们开始讲"行为型"设计模式的第二个模式,该模式是[命令模式],又称为行动(Action)模式或交易(Transaction)模式,英文名称是:Command P ...
- C#设计模式之十四命令模式(Command Pattern)【行为型】
一.引言 今天我们开始讲“行为型”设计模式的第二个模式,该模式是[命令模式],又称为行动(Action)模式或交易(Transaction)模式,英文名称是:Command Pattern.还是老套路 ...
随机推荐
- [你必须知道的.NET]第三十二回,,深入.NET 4.0之,Tuple一二
发布日期:2009.06.01 作者:Anytao © 2009 Anytao.com ,Anytao原创作品,转贴请注明作者和出处. Tuple,是函数式编程的概念之一,早见于Elang.F#等动态 ...
- (3)初次接触off
boss布置任务了,要读入off文件,生成能显示出来的可执行文件,完成不了就要滚蛋 目前的东西还是不用保密的,到后面我就要设密码了 好,.off文件是什么? OFF,Object File Forma ...
- php中include包含文件路径查找过程
首先,“路径”分为三种: 1.绝对路径,以/开头(unix系统)或c:等盘符开头(windows系统). 2.相对路径,以.开头,有./(当前目录)和../(上级目录). 3.其他路径,不是绝对路径和 ...
- 关于JLINK固件丢失或升级固件后提示Clone的解决办法
本人用的JLINK仿真器(某宝上买的),在使用新版KEIL时,提示要升级固件,升级后就出现JLINK is Clone的提示.在网上找了许多关于修复的资料,都觉得不是很好.经过本人反复试验,总算找到比 ...
- Js 日期操作
Js获取当前日期时间及其它操作var myDate = new Date();myDate.getYear(); //获取当前年份(2位)myDate.getFullYear(); ...
- CentOS中通过stat查看文件的元数据
CentOS中可以通过stat查看文件的元数据 [baby@xiaoxiao abc]$ stat honey File: `honey' Size: 25 Blocks: 8 ...
- Android 【问题汇总】列表数组越界的问题
遇到了一个诡异的问题,ListView发生数组越界(偶尔会),程序崩溃. 错误信息如下: W/dalvikvm( ): threadid=: thread exiting with uncaught ...
- ES6入门之set和map
Set ES6提供了新的数据结构Set.它类似于数组,但是成员的值都是唯一的,没有重复的值. Set函数可以接受一个数组(或类似数组的对象)作为参数,用来初始化. // 例一 var set = ne ...
- 路由器扫描的Java源码
这个源码不是本人写的,是我原来的领导写的,我们都叫他东哥,这个是东留给我的一个小资源,好佩服他哦,这个东西可以用来扫描全世界的路由器,破解路由器账户和密码 当然是简单的了.我能力不够没有更完善的补充下 ...
- PowerDesigner15.1创建模型及生成带注释sql操作手册
转自:http://blog.csdn.net/huiwenjie168/article/details/7824029 一.创建模型 操作:file-->new Model… 快捷键:ctrl ...