小白学Mac之四:我的树控件NSOutlineView

surefire 发布于 2015年10月21日 | 更新于 2015年10月21日
Archfeed 等1人欣赏。

没有想到,在Mac下与.Net等价的“树”控件竟然是NSOutlineView,或者就是NSTableView,害得我找了好久。

数据如何显示?

看了会官方的API就开撸了,由于对appkit的一些细节不了解,也搞不清协议是个什么东西,虽然看了官方API的示例代码,但是在撸的时候还是想不明白数据怎么显示呢?因为API文档上讲了要实现NSOutlineViewDataSource和NSOutlineViewDelegate的几个方法,参考了其他一些博客,我开始试着去写一个类,这个类继承NSOutlineView,也实现NSOutlineViewDataSource和NSOutlineViewDelegate的几个方法,然后在实现展示层次的数据结构时遇到了麻烦——子节点怎么搞?具体我无法用语言描述,直到折腾了好几遍才明白,只需要先定义个DataItem的类来放数据,这个类实现父子节点遍历这些功能就可以了,不需要管NSOutlineViewDataSource和NSOutlineViewDelegate。然后在另外一个视图控制器(这个就是我的主界面视图控制器,NSOutlineView是它的一个Subview)中实现NSOutlineViewDataSource和NSOutlineViewDelegate两个协议中显示数据必需的几个方法,再加上一个DataItem的成员即可。

指南指到北去了

API指南的示例代码(OC的),我以为照着做了就行了,结果实现了这4个方法后没有数据显示,又一番折腾,发现这个官方的Demo应该是有问题吧,明明还要实现NSOutlineViewDelegate的outlineView:viewForTableColumn:item方法才行啊。而 outlineView:objectValueForTableColumn:byItem:这个方法不需要实现也可以正常显示数据,我怀疑官方的Demo是不是把这个方法弄混淆了,或者OC与Swift又有某些神秘的区别?反正能显示数据了我也没有去深究。

短暂的兴奋后是新的困惑

终于出了数据,自然是很高兴的。后面再用NSTableView时就相对轻松了,没折腾多久就从数据库中撸出数据并显示出来了,那种高兴还是非常令人印象深刻的。

在这个过程中遇到几个小小的问题,困扰了整整一个多月。一个是我想实现回调功能,二是给NSOutlineView添加鼠标双击事件处理,三是NSOutlineView的Item如何动态设置显示的Image——我想让程序在获取数据库的信息时能够显示出一个“菊花”来,这样体验好,告诉用户它正在请求数据,请稍安勿躁。不过我一直没有找到如何修改的方法。

一开始我是不知道有DoubleAction这个东西的,我以为跟.Net一样的,也许NSOutlineView也有个什么DoubleClick事件之类的,我只要指定事件的响应函数即可,但很快我就泄气了。当然通过IB去outlet一个action的高科技我还是成功掌握了,后来发现mousedown事件中通过计算down的count来判断是不是双击,唉,柳暗花明又一村的感觉有木有?可是这个实现有很多问题,鼠标单击也是在里,双击也是在这里,感觉不好。

然后,某一天我突然就在某个地方发现了DoubleAction这个东西,真是如获至宝,但在指定Selector时又熄火了——网上的都是OC的例子,Swift的没说怎么搞,我指定函数的名称,不行,有的说在后面加冒号,也不行,反正折腾了很久,都搞不定。于是就放下了这个,不过每天都会花上几分钟时间,Google一下相关的帖子,去各个论坛去看,搜关键字等等,期望能有好运气,就这样,一个月的时间很快就过去了。

突破

直到某个加班的夜晚,人困马乏之际,想休息休息,看了看OC,然后又习惯性的Google了一下,也许是老天看我这么执着,这次竟然一下让我看到了stackoverflow上的一个帖子,提到要在方法前加@ objc,我也没看是什么意思,就照着做了,然后就成了。困乏一下就没了,那种喜悦,嘿嘿!

因为这是一次双喜临门:我顺带知道了要实现自己的协议时设置optional方法,他们的函数签名该怎么写,这样我要实现的那个小功能——就是主窗体大小变动时,通过回调子控件中的某个函数做一些设置——也得以一次实现。然后第二天,也许是因为熟悉了的缘故,一下就开窍了,摸索着竟然找到了动态修改NSOutlineView中某个Item的Image,看到“菊花”时隐时现,我兴奋地在说说上签名:昨天我很高兴,今天我很高兴 x 2

编程的乐趣

其实我对编程并没有太多狂热的兴趣,但这也不妨碍我不止一次体会到编程的乐趣。我跟小伙伴说:在找了很多办法也搞不定,就要山穷水尽绝望的时候,稍稍坚持一下,往往曙光就来了。小伙伴表示完全同意。那种解决问题的快感无法用言语表达,说得通俗一点,就是跟射了一样的痛快——虽然这种快感只有很短暂的时间,因为后面又有新的麻烦在等着你。

暂无回复
登录 或者 注册