• Chapter 09 - NSUndoManager (C#实现 + 全网原创)


    此例子针对NSDocument实现了tableview 每一行添加/删除的undo/redo,以及每一个单元格内容编辑的undo/redo。基于NSDocument类的实现。PersonModel + NSMutableArray和前面的例子是一样的,就不重复贴了。采用Array Controller实现view-based tableview的绑定(不会的,翻前面的例子)。在贴代码前,要注意一下几点。

    1. NSUndoManager类下的prepareWithInvocationTarget成员函数,在xamarin中是有bug的。至今微软还没有修复,因为xamarin在转换C#到objective-c代码时,默认调用了C#格式。其次,NSProxy的C#格式没有IntPtr的构造函数。

    2. 因为第一点原因,我们采用objc_msgSend来进行原始的objective-c格式调用。这个是一个Dll的导出函数,格式为: {返回值类型}_objc_msgSend_{参数1类型}_{参数2类型}_...._{参数N类型}。我这里详细讲解一个例子,其余的都是一样。

     

     

     这个声明,对应的C#下的成员函数是这样的格式。目前参数类型有int, float, double等原生类型,所有类统一用IntPtr传值。

     

     

     大家认真阅读我的源代码后,就会明白原理了。好了。看下xcode的布局,记住别忘了设置每个单元格可编辑。如果都看到这里了,说明基本的知识都会了。关于xcode的使用,自己从之前的例子一步一步学习。

    完整的核心代码来啦!!!!在NSDocument的子类RMDocument下实现。xcode中的Array Controller的绑定之后我不再说了,默认是之前例子一样的绑定。不会的,自己去看之前的例子。

     

     

     声明需要采用objective-c格式调用的函数,避免bug 产生。

     

     

     有序KVO下的添加和删除函数,记住Export导出的时候,名字有讲究的。这是因为NSProxy代理时,需要格式化的名字。其次,采用objc_msgSend调用prepareWithInvocationTarget,这样就避开了bug。

     

      

     至此,如果你编译的话,只需要删除StartObservingPerson和StopObservingPerson就会成功。但是呢,只能undo/redo添加和删除的操作,不能undo/redo单元格编辑的内容。为了完善功能,我们需要对每一个PersonModel添加一个Observer,这样的话,单元格内容编辑完成后,会自动调用ObserveValue成员函数(大家可以查看这个函数的协议导出全称,就是objective-c下的"observeValueForKeyPath:ofObject:change:context:")。现在看看如果添加Observer吧,定义一个KVOContext来区分不同group下的redo/undo。这里所有的PersonModel对象,都用一个KVOContext。

     

     

     

     

     

     至此,如果你将"Add Employee"按钮绑定到Array Controller下的"Add" 或 "Insert"操作,就算基本完成啦。但是呢,我还要继续,实现点击“Add Employee”后,让焦点集中在第一列的单元格上,并且等待用户去编辑。如果想实现这个功能,那么就不要绑定Array Controller下的"Add"或"Insert"操作。

     

     

    好啦。测试下。可惜我不会弄动图图,所以大家不能看到redo/undo的所有操作。但是,已经全部实现。

     

     

     点击"Add Employee"后,默认第一列处于可编辑状态。

    将其改成"New Person1",然后再点2次"Add Employee"。把第二行的Raise改成“6”

     

     然后删除第二行,undo两次。

     

     最后redo两次。哈哈哈哈。行和单元格数据的undo/redo都能工作了。

     

     最后退出。下一个例子会实现如何保存修改。

     

     

     

     

     

  • 相关阅读:
    vue快速学习03、ant-design
    网络基础1
    B/S医院HIS绩效考核系统源码
    【软件工程期末复习】知识点+大题详解(E-R图、数据流图、N-S盒图、状态图、活动图、用例图....)
    3D全景虚拟旅游在旅游行业中具备哪些应用价值?
    递归:解题思路
    网站性能测试软件工具【安装教程】
    在 Kubernetes 上快速测试 Citus 分布式 PostgreSQL 集群(分布式表,共置,引用表,列存储)
    Flask狼书笔记 | 08_个人博客(下)
    Windows平台上安装MySql 5.6 /8.0等的各种问题解决办法汇总
  • 原文地址:https://www.cnblogs.com/dalgleish/p/16607624.html