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;
}