文章是基于之前的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一下

 

posted on 2022-11-22 14:53  dalgleish  阅读(78)  评论(0编辑  收藏  举报