IOS设计模式第十篇之命令行设计模式
来源:互联网 发布:淘宝情侣装类目 编辑:程序博客网 时间:2024/05/23 19:36
命令行设计模式:
命令设计模式将一个请求或行动作封装为对象。这个封装请求比原始的请求要灵活并且可以在对象之前被传递,存储,动态修改或者放进队列里面。苹果
苹果公司实现这种模式使用Target-Action机制和Invocation。
你可以阅读更多关于Target-Action机制在苹果的文档但是Invocation类可以包含一个目标对象,方法选择器和一些参数。当需要的时候这个对象可以被动态的改变。
这是一个完美的命令模式的例子。它将发送对象从接收对象和对象和可以持续请求或一连串的请求。
怎么使用命令设计模式?
在你进入invocation 操作之前。你需要设置framework来支持撤销操作。你必须定义一个UIToolBar 和NSMutableArray 来作为撤销栈。
在Viewcontroller实现文件延展里添加其他的实例变量:
UIToolbar *toolbar;
// We will use this array as a stack to push and pop operation for the undo option
NSMutableArray *undoStack;
创建一个toolbar 来展示按钮和新的操作。以及一个数组作为命令队列。
添加下面代码在ViewDidLoad:
toolbar = [[UIToolbaralloc] init];
UIBarButtonItem *undoItem = [[UIBarButtonItemalloc] initWithBarButtonSystemItem:UIBarButtonSystemItemUndotarget:selfaction:@selector(undoAction)];
undoItem.enabled = NO;
UIBarButtonItem *space = [[UIBarButtonItemalloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpacetarget:nilaction:nil];
UIBarButtonItem *delete = [[UIBarButtonItemalloc] initWithBarButtonSystemItem:UIBarButtonSystemItemTrashtarget:selfaction:@selector(deleteAlbum)];
[toolbar setItems:@[undoItem,space,delete]];
[self.viewaddSubview:toolbar];
undoStack = [[NSMutableArrayalloc] init];
上面代码创建一个toolbar带两个按钮和在他们之间添加一个灵活的空间。它还创建一个空撤销堆栈。这里的撤销按钮被禁用,因为撤销堆栈开始空了。
注意,工具栏没有用坐标初始化,由于在ViewDidLoad设置的坐标大小不是最终的。因此最后的设置通过下面代码:
- (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);
}
您将添加三个ViewController方法。m处理专辑管理操作:添加、删除和撤销。
第一个方法用来添加新专辑
在这里你添加一个新专辑,并且设置为当前的索引,并且加载这个滑动视图。
下面是删除方法:
- (void)deleteAlbum
{
// 1
Album *deletedAlbum =allAlbums[currentAlbumIndex];
// 2
NSMethodSignature *sig = [selfmethodSignatureForSelector:@selector(addAlbum:atIndex:)];
NSInvocation *undoAction = [NSInvocationinvocationWithMethodSignature:sig];
[undoAction setTarget:self];
[undoAction setSelector:@selector(addAlbum:atIndex:)];
[undoAction setArgument:&deletedAlbum atIndex:2];
[undoAction setArgument:¤tAlbumIndexatIndex:3];
[undoAction retainArguments];
// 3
[undoStack addObject:undoAction];
// 4
[[LibraryAPIsharedInstance] deleteAlbumAtIndex:currentAlbumIndex];
[selfreloadScroller];
// 5
[toolbar.items[0]setEnabled:YES];
}
对上面做下解释:
1:让这张专辑删除
2:定义一个NSMethodSignature 类型为了创建NSInvocation。为了撤销删除操作。这个
NSInvocation需要知道三个事情:选择器(什么消息被发送),目标(谁发送这个消息)还有消息的参数。这个例子中一旦你撤销删除
他消息发送删除的相反您需要添加删除专辑。
3:撤销操作被创建后添加到空栈里面。这个操作被调价到数组的组后,就像正常的栈。
4:
用libraryAPI来删除专辑从数据架构中并且加载滑动视图。
5:自撤销堆栈的操作,您需要启用撤销按钮
注意:对于NSInvocation你需要注意下面几点:
1:参数必须通过指针传递
2:参数从2的索引开始,指数0和1都保留在目标和选择器。
3:果有机会,参数将被收回,那么你应该叫retainArguments。
最后添加撤销操作:
- (void)undoAction
{
if (undoStack.count >0)
{
NSInvocation *undoAction = [undoStacklastObject];
[undoStackremoveLastObject];
[undoAction invoke];
}
if (undoStack.count ==0)
{
[toolbar.items[0]setEnabled:NO];
}
}
撤消操作“弹出”中的最后一个对象栈。这个对象总是NSInvocation类型,可以通过调用调用…调用。这张专辑删除时调用的命令很早被创建。并添加删除专辑专辑列表。因为你也删除最后一个对象在堆栈“弹出”时,你现在看看栈是空的。如果是,这就意味着没有更多的行动取消。所以你禁用撤销按钮。构建和运行您的应用程序来测试你的撤销机制,删除一个专辑(或两个),点击取消按钮看它的实际应用:
这也是一个不错的测试是否保留更改相册数据之间的会话。现在,如果你删除一个专辑,将应用程序发送到后台,然后终止应用程序,下次启动应用程序显示专辑列表应该反映删除。
- IOS设计模式第十篇之命令行设计模式
- 设计模式之(Command)命令行模式
- 设计模式之命令行模式(Command)
- IOS设计模式之组合设计模式
- ios设计模式之模板设计模式
- IOS设计模式第二篇之单例设计模式
- IOS设计模式第六篇之适配器设计模式
- IOS设计模式第七篇之观察者设计模式
- 第十篇 设计模式--桥接模式
- 设计模式-命令行
- IOS设计模式第四篇之装饰设计模式的类别设计模式
- IOS设计模式第五篇之装饰设计模式的代理设计模式
- iOS之Delegate设计模式
- iOS设计模式之生成器
- iOS开发之设计模式
- iOS之代理设计模式
- iOS开发之设计模式
- IOS设计模式之二:Delegate模式
- Microsoft SQL Server 2008性能分析之执行计划
- money problem
- android 之动画 (二) 插值器
- IOS学习 对于协议的理解
- Object-c @class
- IOS设计模式第十篇之命令行设计模式
- 解决ListView中Item的子控件与Item点击事件冲突
- C# 中的 #region 和 #endregion的作用
- 第16周【项目 2-用指针玩字符串】④
- vnc配置,几分钟设置好vnc远程控制
- Android学好Shape不再依赖美工
- 求奖金总数
- 第十六周项目一——数组的排序
- 医学图像增强