Cocoa教学:使Core Data支持恢复操作
时间: 2009-06-11 19:43 点击: 次
在Cocoa中,恢复操作(Undo)是一个很有用的功能,但是希望将它整合到Core Data中的人们知道,这个过程可能会有一点令人沮丧。
通常来说,你不需要在意Undo功能,这个内建的功能就可以直接被支持。但是如果你使用了Core Data,情况就会变得复杂一些。
这是一篇cimgf的优秀作品,cocoachina将其翻译过来,帮助国内读者更容易阅读。
作者:Marcus Zarra
原文地址:http://www.cimgf.com/2008/04/30/cocoa-tutorial-wiring-undo-management-into-core-data/
与NSUndoManager冲突
如果你使用过Cocoa的Undo功能的话,你应该清楚所有的恢复操作都是注册到NSUndoManager中的。在一个普通的基于文档的程序中,窗口的托管会提供给NSUndoManager窗口中包含的所有文本框和其他可编辑内容。
但是如果加入了Core Data,情况就不一样了。原因是NSManagedObjectContext有自己的NSUndoManager,注册了同样的消息,所以我们就很难控制恢复操作。
我希望的情况是尽量避免有两个NSUndoManager,而仅仅使用NSManagedObjectContext自带的那个。通过下面窗口托管方法中的代码,可以实现这个功能:
- (NSUndoManager *)windowWillReturnUndoManager:(NSWindow *)window
{
return [self undoManager];
}
- (NSUndoManager*)undoManager
{
return [[self managedObjectContext] undoManager];
}
通过使用包含在NSManagedObjectContext中的NSUndoManager,我们就可以使用一些非常有用的功能了。
使用分组对数据进行修改
正常的界面设计可以在一个弹出窗口中编辑对象。用户可以双击物件,也可以点击。点击对象表示他们希望编辑其中的内容,我们可以弹出一个窗口让他们修改其内容。那么自然弹出的这个窗口中也包含了一个NSUndoManager(也可以使用Core Data中自带的),这样,每个编辑框中的内容都可以恢复。不过,我们如何处理“取消”按钮,或者如何取消整个弹出窗口中内容的编辑呢?
上面所提的两个问题都可以使用在NSManagedObjectContext对象中的NSUndoManager里提供的分组功能实现。通过以下代码可以做出这种效果:
- (void)presentEditSheet:(id)sender
{
[[self undoManager] beginUndoGrouping];
[NSApp beginSheet:[self editSheet]
modalForWindow:[self window]
modalDelegate:nil
didEndSelector:NULL
contextInfo:nil];
}
- (void)acceptChanges:(id)sender
{
[[self editSheet] orderOut:sender];
[NSApp endSheet:[self editSheet]];
[[self undoManager] endUndoGrouping];
[[self undoManager] setActionName:@"Object edit"];
}
- (void)cancelChanges:(id)sender
{
顶一下(0)
0%
踩一下(0)
0%
下一篇:检测系统版本是否为Leopard
发表评论
本类文章点击排行榜
- [06-18] Cocoa夜未央第一期 Cocoa的基本
- [06-18] UITableView实例教程:创建Tabl
- [06-18] Cocoa夜未央第三期 MVC,界面编
- [06-18] Cocoa夜未央第二期 xcode及基本
- [06-02] XCode自带Source Control Manager(SC
- [07-27] Xcode 4 新特性介绍
- [06-11] Google的开源苹果软件更新框架
- [06-11] Leopard轻松编程:帮你节省代码
- [06-11] WebKit的基本用法
推荐内容
最近更新
- [07-27] Xcode 4 新特性介绍
- [07-23] UTF-8 和 GBK 的 NSString 相互转化的方法
- [07-09] NSSlider控件出现残像的解决方法
- [07-07] 调用系统现成importer来获取文件metadata的方法
- [06-30] 实现鼠标拖拽删除对象时烟雾缭绕效果的代码
- [06-28] QuickLook 调用示例代码
- [06-22] Cocoa里的字符串,NSString介绍
- [06-22] Cocoa里参数传递引用的方法
- [06-21] 在 xcode中进行条件编译的方法
相关文章
- [03-13] 在Label上增加点击事件及下划线的方法
- [02-05] [系统控件重绘教程(二)]重绘NSButton
- [02-03] XCode模板
- [06-11] 在自定义NSTextField中响应键盘消息
- [06-11] 如何为视图设置鼠标指针图形
- [06-11] 如何在NSView中检测键盘方向键
- [06-11] 如何将禁用的文本框内容颜色变灰
- [06-11] 小技巧:读取一个nib文件


XCode自带Source Control Manager(SCM)以及SnapShots用法
XCode、Cocoa开发中使用第三方dylib的方法
[系统控件重绘教程(二)]重绘NSButton
创建Xcode自定义模板的图文教程
在Cocoa中使用TagLib获取歌曲ID3信息
iLife 08风格的Source List代码