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.还是老套路 ...
随机推荐
- POJ 1870 Bee Breeding(找规律)
题目链接 题意 : 给你一个蜂巢状图形,让你找出两个点之间的距离. 思路 : 在做这个题之前可以看一下2265,因为是一种题来着,规律就是我在2265里写的那样,然后就是求距离了,求距离的时候只需考虑 ...
- poj 3615(floyd变形)
题目链接:http://poj.org/problem?id=3615 思路:map[i][j]表示顶点i,j之间的最高的障碍物,于是题目要求的是最高障碍物的最小值,不就是min(map[i][j], ...
- java+内存分配及变量存储位置的区别[转]
原文来自:http://blog.csdn.net/rj042/article/details/6871030#comments Java内存分配与管理是Java的核心技术之一,之前我们曾介绍过Jav ...
- MongoDB (七) MongoDB 数据类型
MongoDB支持许多数据类型的列表下面给出: String : 这是最常用的数据类型来存储数据.在MongoDB中的字符串必须是有效的UTF-8. Integer : 这种类型是用来存储一个数值.整 ...
- online judge 提交代码应该注意的事项
首先,eclipse工程上出现红色的惊叹号,这个时候一般是工程的参考library或者build path的jar文件或者库文件缺失,可以右键工程,打开properties,点击 java build ...
- Dice chrone execise
def score(dices_input): count = {}.fromkeys(range(1, 7), 0) points = 0 for dice_side in dices_input: ...
- SPRING IN ACTION 第4版笔记-第十一章Persisting data with object-relational mapping-004JPA例子的代码
一.结构 二.Repository层 1. package spittr.db; import java.util.List; import spittr.domain.Spitter; /** * ...
- 针对安卓java入门:数据类型
基本数据类型: 布尔型----boolean字符型----char 用单引号整数型----byte(字节型),short(短整型),int(整型),long(长整型)浮点数型--float(浮点型), ...
- BI
http://www.cnblogs.com/biwork/p/3276455.html http://www.cnblogs.com/biwork/p/3328879.html http://www ...
- ftp 建立、配置、实用软件 fileZilla server
ftp 建立.配置.实用软件 fileZilla server