文章是基于之前的RaiseMan的例子修改的。为了避开申明Person类型和复杂的手动实现value key & value & remove & add的redo/undo,所以本例子采用CoreData + ArrayController + NSPersistentDocument,至于如何编译xcdatamodeld文件,请参考之前的文章。项目Resource文件夹下应该如图所示:
关于绑定,请参考之前的Chapter 11中的文章。除此之外,其余代码和书上一样,由于NSPersistentDocument只是默认实现了值的undo/redo,所以要手动实现remove/add的undo/redo。既然要手动实现,就实现可多选的redo/undo吧。
Employees.xcdatamodeld内容
AppController.cs 这个和书上有点区别,我让此继承于NSArrayController,这样方便我实现CoreData的NewObject属性。其次,菜单Preference项的实现,关联到showPreferencePanel(和书上一样)。如图。
PreferenceController.cs和书上一样,独立的xib窗口。如图。
关联这些,之后都不说了,学到这里,看看书和代码,基本可以搞定。除非有特殊的关联,会单独提出来讲。
RMDocument.cs,即使实现remove/add的redo/undo的,利用默认的key & value的redo/undo实现。代码如图。
obj_msgSend导出,必须这样实现,不然会报错。之前的文章已经说了,是微软的bug,至今未修复。
Add Employee按钮的实现 (this.Add之后单独贴,是redo/undo的实现)
Remove按钮的实现
Add私有函数实现(记住添加导出名,方便redo/undo调用)
Remove私有函数实现
其余和书上一样,这样做省去了Person class的声明,省去了value + key的Oberve,利用NSPersistentDocument的部分默认redo/undo。
好了,看看测试结果
删除3和1
undo一下
redo一下
标签:Chapter,12,NSWindowController,实现,undo,value,书上,redo,NSPersistentDocument From: https://www.cnblogs.com/dalgleish/p/16915146.html