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

大家认真阅读我的源代码后,就会明白原理了。好了。看下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#实现 + 全网原创)的更多相关文章
- 菜鸟笔记 -- Chapter 09 常见类和接口
Java为我们提供了丰富的jar包支持,这其中很多都是我们日常开发所必须的,了解这些包和类,十分有助于我们的开发,深度了解源代码也有助于我们代码的优化和提高;JDK1.8为我们提供了多于4000个类与 ...
- 蟒蛇书学习笔记——Chapter 09 Section 01 创建和使用类
9.1 创建和使用类 9.1.1 创建Dog类 根据Dog类创建的每个实例都将存储名字和年龄,我们赋予了每条小狗蹲下(sit( ))和打滚(roll_over( ))的能力: class Dog: ...
- ED/EP系列7《指令速查表》
命 令 CLA INS ...
- 一个人写的操作系统 - Sparrow OS
一个人写的操作系统 - Sparrow OS 自己写一个操作系统,这是在过去的几年里我一直为之努力的目标,现在终于完成了. 缘起 自己动手写操作系统的动机最初来自于学习Linux遇到的困难. 我是一个 ...
- 找出并解决 JavaScript 和 Dojo 引起的浏览器内存泄露问题
简介: 如果大量使用 JavaScript 和 Ajax 技术开发 Web 2.0 应用程序,您很有可能会遇到浏览器的内存泄漏问题.如果您有一个单页应用程序或者一个页面要处理很多 UI 操作,问题可能 ...
- 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 ...
- Cesium基础使用介绍
前言 最近折腾了一下三维地球,本文简单为大家介绍一款开源的三维地球软件--Cesium,以及如何快速上手Cesium.当然三维地球重要的肯定不是数据显示,这只是数据可视化的一小部分,重要的应该是背后的 ...
- TL-WR703Nv1.7刷写openwrt固件
TP-LINK TL-WR703N是一个小型的路由器,可以有线转WiFi,3G转WiFi,很多人拿它刷openwrt系统,然后可以在上面各种搞事. V1.7以前 通常刷openwrt的做法是, 下载一 ...
- Cesium中Clock控件及时间序列瓦片动态加载
前言 前面已经写了两篇博客介绍Cesium,一篇整体上简单介绍了Cesium如何上手,还有一篇介绍了如何将Cesium与分布式地理信息处理框架Geotrellis相结合.Cesium的强大之处也在于其 ...
随机推荐
- Random方法中的nextInt(int arg0)方法讲解
nextInt方法会生成一个随机的在5以内的数,负载均衡随机策略底层用的就是这个方法: Random rand = new Random(); int index = rand.nextInt(5); ...
- CabloyJS一站式助力微信、企业微信、钉钉开发 - 钉钉篇
前言 现在软件开发不仅要面对前端碎片化,还要面对后端碎片化.针对前端碎片化,CabloyJS提供了pc=mobile+pad的跨端自适应方案,参见:自适应布局:pc = mobile + pad 在这 ...
- Google搜索为什么不能无限分页?
这是一个很有意思却很少有人注意的问题. 当我用Google搜索MySQL这个关键词的时候,Google只提供了13页的搜索结果,我通过修改url的分页参数试图搜索第14页数据,结果出现了以下的错误提示 ...
- 想学设计模式、想搞架构设计,先学学UML系统建模吧您
UML系统建模 1 概述 1.1 课程概述 汇集UML及其相关的一些话题 回顾UML相关的符号与概念 以电商订单相关业务为例,借助UML完成系统建模 将UML变成提升建模效率,表达架构思想的工具 1. ...
- Java学习-第一阶段-第一节:Java概述
JAVA概述 Java版本 原网址(https://www.oracle.com/java/technologies/java-se-support-roadmap.html) Oracle 将仅将某 ...
- Bika LIMS 开源LIMS集——ERD实体关系定义(数据库设计)
系统数据分类 数据分为四类: template 模板,基础静态数据 static 静态数据,核心静态数据,检测方法等 dynamic 动态数据,样品检测流程数据 organisation 组织机构数据 ...
- java中的方法重载(overload)
什么时候方法重载:当两个方法的功能是相似的,可以考虑使用方法重载.若两个方法根本没有关系,无必要使用方法重载. 什么时候代码会发生方法重载:三个条件:1,在同一个类中.2,方法名相同.3,参数列表相同 ...
- UiPath选择器之页面选择器的介绍和使用
一.页面选择器的介绍 某些软件程序的布局和属性节点具有易变的值,例如某些Web应用程序.UiPath Studio无法预测这些变化,因此,您可能必须手动生成一些选择器. 每个属性都有一个分配的值.选择 ...
- js烧脑面试题大赏
本文精选了20多道具有一定迷惑性的js题,主要考察的是类型判断.作用域.this指向.原型.事件循环等知识点,每道题都配有笔者详细傻瓜式的解析,偏向于初学者,大佬请随意. 第1题 let a = 1 ...
- Git下载(快速快速快速下载!!)
在安装Git环境的时候,需要下载Git的安装包,但是官网的下载网速实在是太慢的(几十M的安装包,下载速度只有几十K) (所以可以在镜像中下载,速度超快) Git镜像下载链接-------------- ...