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.还是老套路 ...
随机推荐
- mvc5 _ViewStart.cshtml 模板页如何定义
1._Viewstart.cshtml是一个在呈现View文件的时候的启动文件,会在所有View(.cshtml)被执行之前执行,主要用于一些不方便或不能在母版(_Layout.cshtml)中进行的 ...
- C Primer Plus之位操作
二进制补码表示法 几乎所有的计算机都使用二进制补码表示法来存储位于n位存储单元中的有符号整数. 在二进制补码表示法中,最左位决定符号.如果它是0,该整数为正(即非负):如果是1,该整数为负 ...
- 问题:-[UIViewController _loadViewFromNibNamed:bundle:] loaded the "BlueView" nib but the view outlet was not set.
问题:-[UIViewController _loadViewFromNibNamed:bundle:] loaded the "BlueView" nib but the vie ...
- linux 中permission denied的问题:
执行安装命令的时候 ./install 遇到 permission denied, bash: ./install: Permission denied另外,在 root下也是同样的问题, 请教该如何 ...
- LoadRunner8 安装步骤
一.介绍 LoadRunner,是一种预测系统行为和性能的负载测试工具.通过以模拟上千万用户实施并发负载及实时性能监测的方式来确认和查找问题,LoadRunner能够对整个企业架构进行测试.企业使用L ...
- JLink and JTAG等接口简介
1.JTAG JTAG用的计算机的并口,JTAG也是一种国际标准测试协议(IEEE 1149.1兼容),主要用于芯片内部测试.现在多数的高级器件都支持JTAG协议,如DSP.FPGA器件等. 标准的J ...
- php 写入数据到MySQL以及从MySQL获取数据,页面出现乱码的解决方法
现象如标题. 解决思路: 1确定数据库charset是否是utf-8 a. charset不是utf-8 1, 更改数据库charset为utf-8 ALTER DATABASE db_name DE ...
- 266. Palindrome Permutation
题目: Given a string, determine if a permutation of the string could form a palindrome. For example,&q ...
- Android 使用意图传递数据
使用意图传递数据之通用方式. 测试应用:当前页面点击button传递数据到一个新的页面显示在textview中. 首先在,mainActivity.xml文件中加入一个button按钮 <But ...
- USACO Section 4.2: Drainage Ditches
最大流的模板题 /* ID: yingzho1 LANG: C++ TASK: ditch */ #include <iostream> #include <fstream> ...