2012年1月26日星期四

Mac OS X Lion的触摸板手势的Bug

今天莫名其妙的发现,我的iMac的TrackPad不再支持Swiping Change Spaces了。也就是四指横扫不能切换桌面,这个对于触摸板重度使用的我来说,很不爽啊。

虽然有人会说你可以切换到三指横扫啊,的确,三指横扫切换后也能切换了,但是这样就无法使用三指移动窗口这个很有用的手势了。

这是一个OS X的Bug。其实解决很容易,问题的关键是,首先当你选择三指横扫切换桌面时,系统会默认取消选中三指移动手势的选项。这时候你在去选中三指移动手势,这时候系统却会自动将前者变成四指左右切换,而实际这个四指看着选中,其实等于没有生效。效果就是四指横扫不再能切换了,虽然属性设置上明明看到设置打钩了,但是实际却没有用。

解决方式也很简单。
统统取消两者的选中状态,先选择四指左右横扫切换,然后再选择三指移动手势,bingo,生效了。

这个小Bug还真是莫名其妙的无聊啊。苹果产品其实并不那么完美,细节地方真的有很多漏洞的。

2012年1月13日星期五

Cocoa Application的聚焦问题

我写了个很简单的程序,一个Window上面有一个输入框和一个按钮。程序启动起来的时候,总是会发现焦点自动聚焦到了文本框内,还选中了文本。我很不喜欢这个状态。因此,我要改变他。研究了很久,也折腾了很久,得到了一些经验,总结一下,写在这里。

其实在Mac上的聚焦的概念,不是windows里面的那种执行一个focus命令就可以的。在Cocoa里面,聚焦其实应该理解为FirstResponder。只要一个控件成为NSApplication的FirstResponder就意味着他有了焦点,所以的鼠标按键消息都会第一个发送给他由他来响应。

我的解决方法是在程序启动的时候执行 NSWindow makeFirstResponder: window。即让程序的窗体本身成为FirstResponder,这样文本框自然而然的失去了焦点。

但是我犯了一个错误,我为了使用NSWindow,而在AppDelegate里面建立了一个窗体的outlet引用。事实证明,程序运行时,这个window的outlet不会被赋值,始终拿到的是一个nil。这个错误让我折腾了好几天都不明白为什么命令会无效,其实处理消息的主体根本就是一个nil,结果当然更不会正确了。

我的解决方法是,[NSTextBox window]消息上来得到正确的window对象。

依法而行,即可解决聚焦的问题。

Objective-C对nil发送消息不会出现错误,这一点还真是让人抓狂啊,有时候有些错误死活不会发现就因为这么一个郁闷的特性。

2012年1月6日星期五

如何让Cocoa Application关闭窗口后完全退出

默认情况下,Xcode创建的程序关闭主窗口后,程序并不会完全退出,而是保留在内存中。在Dashboard上会有停留程序图标,如果常驻Dashboard的话,图标不仅不会消失,还有会亮灯表示程序还在运行。这个倒是和mplayerx比较相似。其实只要在程序的AppDelegate类里面增加以下方法,就可以实现关闭所有窗口后,完全退出程序。记一下,以备将来忘记查询用。




- (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)sender{
    return TRUE;
}


2011年12月31日星期六

根据需要切换MBA的网络

最近开始带着MBA上班,办公室的网络需要指定IP,而家里的网络是DHCP自动获得IP。所以每次都需要切换网络设置的位置。我建立了两个配置,一个叫Office,一个叫Home。于是决定写个applescript来方便的切换配置。

这里备份一下,以备将来查询。


set location to the button returned of (display dialog "Please choose the network location" buttons {"Office", "Home"} default button 1)
set cmd to "scselect " & location
tell application "System Events"
tell network preferences
do shell script cmd
end tell
end tell

--wait for 2 seconds to connect openvpn
delay 2

--connect openvpn
tell application "Tunnelblick"
activate
disconnect all
connect "puff"
end tell

--wait for 5 seconds to open adium
delay 5

--start adium
tell application "Adium"
activate
go online
end tell



2011年12月30日星期五

奇怪的Xcode的git管理

Xcode的种种稀奇古怪的毛病,我之前就略有耳闻,从来没体验过。今天碰到了第一次。

Xcode可以新建项目时,选择使用git作为代码管理工具,新建项目后,Xcode会把自动生成的一些类直接提交作为初始版本。但是我今天碰到了一个奇怪的问题,新建项目完成后,无法提交任何代码,Xcode里面老是提示没有有效的Working Copy,让我确认是否有代码处于管理之中。这个就比较奇怪了,第一个版本都是它自己帮我提交的呀。

我用命令行直接进行git操作,一切正常。

只能求助于网络了,在Stackoverflow找到了答案,重启电脑。

一试真的是泪流满面啊,成功了。

有时候这种稀奇古怪的毛病往往会让用户哭笑不得啊,这东西还真的是出名的烂,可是又没有第二选择,苹果的东西就是如此的让人爱恨交加。

2011年12月29日星期四

openvpn在windows和mac os下配置的不同点

我一直在使用puff版的openvpn服务,在他的邮件里面直接提供了puff的openvpn的配置包。按照结构来说,应该是标准的openvpn服务需要的文件。在windows下用openvpn的客户端使用这个包非常方便,应该说,是拿来就能用的。估计puff本人应该是测试过这些配置。要用,只要在配置文件里面修改一下注释,让软件读取那个userpassword的txt文件,就可以拨号翻墙了。帐号的用户名和密码都直接写在那个txt文件里面。

而正是这个txt文件,却让我在mac os上无法正常的使用openvpn服务。因为我用的是tunnelblick这个很普遍的mac os的openvpn软件。用这个软件按照说明导入这个配置包的时候,却老是会报错误。我以下描述一下需要注意的问题点,以备将来查询使用。

1.原来的配置文件是zip打包的,而tunnelblick不支持直接导入zip。需要把文件解压出来,放在一个子目录下,然后重命名这个子目录,加上后缀.tblk。这时候这个目录就会被系统识别为tunnelblick的配置文件,图标都会变化。双击这个文件,就会启动tunnelblick自动导入了。

2.其实上面一步做完并不能正确的导入这个配置,原因是tunnelblick并不支持配置文件中存在那个保存用户名密码的txt文件。需要把这个文件删除后,才能正确导入。其实不用担心,mac os系统不需要那个文件来记录密码,我们有keychain。

3.导入后,并不能马上使用。会报什么tun不存在的错误。问题就在于配置文件里面存在中文注释,导致tunnbelblick无法正确读取配置内容。在tunnbelblick中选择编辑配置文件,把文件头部的中文注释统统删除保存即可。

2011年10月24日星期一

迅雷离线的Safari插件

没什么事情,就自己折腾了一个Safari的插件。用处就是禁用迅雷离线页面的右键菜单功能,然后直接生成下载链接。

原理很简单,原来我是通过一个bookmarklet来实现的,但是总归是不方便,每次进入画面都得按一下链接。

有了插件,就可以省却这点麻烦事情了。

哈哈,在公司的PC开发的,不知道Mac下是否能正常工作,回去试试看。

下载链接