Monthly Archives: October 2008

How to write an IM using Cocoa (1)

使用NSOutlineView和MouseTracking 要做一个IM当然首要就是能够管理用户了,所以,要求具有显示分组用户的需求,就像Adium和iChat。我开始想用NSTableView,但是这个类不具有分组的功能,后来看到了NSOutlineView就解决了分组的问题。 分组问题解决方案: 要使用分组功能,就必须为NSOutlineView实现datasource和delegate的一些函数: outlineView:child:ofItem:、outlineView:numberOfChildrenOfItem:和outlineView:objectValueForTableColumn:byItem:告诉了NSOutlineView它的每行每列应该显示怎样的数据。如果你想要编辑某一行的内容,比如说你想要编辑IM中某个好友的昵称,就可以实现outlineView:setObjectValue:forTableColumn:byItem:这个方法。 只要上述方法能够正确返回你自己定义的结构,那么就可以正确分组显示用户了。 现在的问题是,你不能显示头像,不能显示状态,只能显示用户名,因为现在NSOutlineView默认的显示单元是NSTextfieldCell,如果想显示更为丰富的内容,那么你就要定义自己的NSCell子类。 自定义行的内容解决方案 定义自己的NSCell子类,比如myCell。 在myCell中实现方法drawInteriorWithFrame:inView:,这个方法定义了NSOutlineView中某行的显示内容,你可以在这个方法中绘制上用户的头像,用户的状态,或者用自定义的信息。这个方法一定要实现,否则还是只能显示文本。 调用setDataCell:或者在Interface Builder中直接指定NSOutlineView的显示单元为myCell。 又有问题了myCell怎么知道用户的状态、头像呢? 还记得前面实现的outlineView:objectValueForTableColumn:方法吗,这个方法的返回值是一个指针(id),我们可以返回任何值,一般只需要返回NSString就可以了,因为这个返回值的接收方就是NSOutlineView的显示单元,我们想要让myCell知道用户的头像等信息,我的解决方法: 就是将这些信息全部包含到outlineView:objectValueForTableColumn:的返回值中,定义一个自己的数据结构,比如FriendInfo类。记住FriendInfo类一定要实现方法copyWithZone:方法,否则myCell无法接收。 在myCell中调用方法objectValue:函数,得到之前传递过来的FriendInfo指针,这样,我们就可以在myCell中绘制想要的信息了。 我们现在已经很好实现了用户列表的功能了,不过似乎还是没有iChat中那么明显的分组功能,想要明显一些,那么实现这个方法吧,还是NSOutlineView的degelate方法:outlineView:isGroupItem:,这样看起来就比较像iChat了。效果参见下面图片: ==================== 上面说了怎么去建立一个看起来不错的用户列表,下面说说迷人的按钮是怎么做出来的,就像lumaqq中这个迷人的+号按钮,这里就用到了我前面提到的MouseTracking 其实说起来,这个+按钮就是两张图片,当没有事请发生的时候显示一张,当鼠标进入 图片区域的时候显示另一张,鼠标在这个图片区域按下就相应一些事件,很多mac下面的程序都用这个方法去实现按钮,确实可以做的很漂亮,也很方便。要想实现这个功能,我们要做下面几步: 定义一个跟踪区域,使用初始化函数initWithRect:options:owner:userInfo:定义一个NSTrackingArea跟踪区域。 把这个区域使用addTrackingArea:方法添加到某一个NSView对象中。 有必要的话,实现updateTrackingAreas方法来更新这个区域,一般在窗口大小改变的时候会调用这个方法。 调用mouseEntered:、mouseMoved:、mouseExited:等方法来响应鼠标事件,实现按钮的模拟。 还可以调用cursorUpdate:方法来改变鼠标的外观。 通过这些,我们就可以非常好的做出漂亮的按钮了。

How to write an IM using Cocoa (0)

开始学Cocoa已经有一段时间了,准备开发一个IM,具体是什么IM就不透露了,其实对于我来说,底层数据结构很简单,最难的就是UI了。所以我就决定写个系列文章,把我遇到的问题和解决方法都记录下来。这里第0篇就算是目录吧,以后我会陆续写其他篇,同时也会更新这篇来进行索引,敬请关注了XD。 目录: How to write an IM using Cocoa (1) How to write an IM using Cocoa (2) How to write an IM using Cocoa (3)

Once a purple, Always a purple

鲁尼曾经说“Once a blue, always a blue”,不过,这句话现在已经成为埃弗顿球迷嘲笑他的把柄。也是,不是爷们,就不要放这样的狠话。 巴乔曾经什么也没有说过,但是他却真正做到了“Once a purple, Always a purple”。紫百合的球迷最喜欢的球星有两个,一个是巴蒂,另一个就是巴乔。巴乔一生最重要的球队就是紫百合了,因为他曾在尤文图斯对紫百合的比赛中不但拒罚点球,而且在下场时捡起紫百合球迷扔给他的紫色围巾。 下面时前几天的一场比赛宣传画,关乎巴乔,关乎情谊,关乎足球!

前路漫漫

我的硕士已经读了1年了,现在面临找工作。很多高中同学、大学同学都选择了出国而不是工作,当然,他们有他们的想法,我选择工作,自然也有我自己的理由。 首先,我自己不适合搞研究,学术界的氛围我适应不了,我也没有这方面的天赋;我不会把一文不值的东西包装的天花乱坠,我也不会想尽办法去发paper;如果我搞研究,我只会踏踏实实,做自己觉得有用的,自己感兴趣的。可这样在学术界也不好混啊,如果不能立竿见影得到成果,就没有生存下去的可能啊。我自己还是比较喜欢实实在在的技术,如果能造福周围的人,我就感到很高兴了。别人能玩我做的游戏或者我写的软件,是最好的。 其次,有人会说,出国也可以工作啊,是啊,出国也可以是去工作,不过我生在中国,我还是希望在中国工作的,尽管为祖国贡献之类的大家都知道很空,但是我还是希望能贡献我自己的力量。 再次,选择在国内工作,还有一方面是我觉得国内的发展前景比较广阔。虽然现在国内的IT行业乱七八糟,不过我相信这是发展中的必经之路,在不久的将来将来,国内的IT行业会比较正规的,市场经济会淘汰这些胡搞的小公司的,即使不被淘汰,他们也会好好反省。 最后,我的梦想是可以在中国创立一个像Pixar的公司! 这些就是我不出去的原因,可能我今后很长一段时间都会比较民工,但是我相信我会实现自己的梦想。自己的路需要自己去走,模仿别人是不会有成就的。 注:以上文字绝对没有对各位出国的和做研究的表示不敬