此例子针对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#下的成员函数是这样的格式.

大家认真阅读我的源代码后,就会明白原理了。好了。看下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都能工作了。

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

Chapter 09 - NSUndoManager (C#实现 + 全网原创)的更多相关文章

  1. 菜鸟笔记 -- Chapter 09 常见类和接口

    Java为我们提供了丰富的jar包支持,这其中很多都是我们日常开发所必须的,了解这些包和类,十分有助于我们的开发,深度了解源代码也有助于我们代码的优化和提高;JDK1.8为我们提供了多于4000个类与 ...

  2. 蟒蛇书学习笔记——Chapter 09 Section 01 创建和使用类

    9.1 创建和使用类 9.1.1 创建Dog类   根据Dog类创建的每个实例都将存储名字和年龄,我们赋予了每条小狗蹲下(sit( ))和打滚(roll_over( ))的能力: class Dog: ...

  3. ED/EP系列7《指令速查表》

    命 令                                                             CLA                  INS             ...

  4. 一个人写的操作系统 - Sparrow OS

    一个人写的操作系统 - Sparrow OS 自己写一个操作系统,这是在过去的几年里我一直为之努力的目标,现在终于完成了. 缘起 自己动手写操作系统的动机最初来自于学习Linux遇到的困难. 我是一个 ...

  5. 找出并解决 JavaScript 和 Dojo 引起的浏览器内存泄露问题

    简介: 如果大量使用 JavaScript 和 Ajax 技术开发 Web 2.0 应用程序,您很有可能会遇到浏览器的内存泄漏问题.如果您有一个单页应用程序或者一个页面要处理很多 UI 操作,问题可能 ...

  6. How To Configure VMware fencing using fence_vmware_soap in RHEL High Availability Add On(RHEL Pacemaker中配置STONITH)

    本文主要简单介绍一下如何在RHEL 7 Pacemaker中配置一个fence_vmware_soap类型的STONITH设备(仅供测试学习). STONITH是Shoot-The-Other-Nod ...

  7. Cesium基础使用介绍

    前言 最近折腾了一下三维地球,本文简单为大家介绍一款开源的三维地球软件--Cesium,以及如何快速上手Cesium.当然三维地球重要的肯定不是数据显示,这只是数据可视化的一小部分,重要的应该是背后的 ...

  8. TL-WR703Nv1.7刷写openwrt固件

    TP-LINK TL-WR703N是一个小型的路由器,可以有线转WiFi,3G转WiFi,很多人拿它刷openwrt系统,然后可以在上面各种搞事. V1.7以前 通常刷openwrt的做法是, 下载一 ...

  9. Cesium中Clock控件及时间序列瓦片动态加载

    前言 前面已经写了两篇博客介绍Cesium,一篇整体上简单介绍了Cesium如何上手,还有一篇介绍了如何将Cesium与分布式地理信息处理框架Geotrellis相结合.Cesium的强大之处也在于其 ...

随机推荐

  1. CSS中html的标签元素分类

    在CSS中,html中的标签元素大体被分为三种不同的类型: 块状元素.内联元素(又叫行内元素)和内联块状元素.    常用的块状元素有:  <div>.<p>.<h1&g ...

  2. JAVA - 序列化的方式

    JAVA - 序列化的方式 序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程.在序列化期间,对象将其当前状态写入到临时或持久性存储区.以后,可以通过从存储区中读 ...

  3. [pwn基础]动态链接原理

    目录 [pwn基础]动态链接原理 动态链接概念 动态链接调用so例子 GOT(全局偏移表) got表劫持小实验 PLT(延迟绑定) PLT概念 延迟绑定(PLT表) 实战学习 [pwn基础]动态链接原 ...

  4. 线上问题定位利器 jprofiler

    1.导出dump windows: jps -l   查看Java进行 jmap -dump:format=b,file=webapi.hprof 20840 查看进程,根据进程号导出hprof文件 ...

  5. 2.2.1 用户态、内核态的形成 -《zobolの操作系统学习札记》

    内核态的出现,让计算机系统的权力向操作系统高度集中了. 操作系统分出内核态和用户态,就是为了进行不同等级的权限管理, 从而更好的适应多用户多任务并发的工作环境. 用户态和内核态的来源 在早期的单进程单 ...

  6. VR技术的应用领域有哪些?

    5G时代已经到来,新技术的商用不仅能够为用户带来更快的网络连接速度,那些依靠网速的提升,而得以更快发展的科技企业,也迎来了新的发展契机. 这其中,尤为值得关注的是VR领域. 谈起VR,这并不算一个陌生 ...

  7. 让我们用Vue cli全家桶搭建项目

    一般项目都会用到这几个,这里不在详细介绍概念,只是简单的使用.一.搭建cli 1.事先安装好cnpm(淘宝镜像) npm install -g cnpm --registry=https://regi ...

  8. React中setState方法说明

    setState跟新数据是同步还是异步? setState跟新数据是异步的. 如何用代码表现出来是异步的. 点击按钮更新数据,然后去打印这个值看一下 setState跟新数据是异步的 class Fa ...

  9. Linux远程连接工具和运行级别

    常用的Linux远程连接工具: xshell MobaXterm windows的命令行工具 Linux的运行级别 linux有七个运行级别 0----所有的服务都不开启,代表的式关机 1---代表的 ...

  10. MYSQL的事务和索引

    事务 什么是事务 事务就是将一组SQL语句放在同一批次内去执行 如果一个SQL语句出错,则该批次内的所有SQL都将被取消执行 MySQL事务处理只支持InnoDB和BDB数据表类型 事务的ACID原则 ...