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发送消息不会出现错误,这一点还真是让人抓狂啊,有时候有些错误死活不会发现就因为这么一个郁闷的特性。

没有评论:

发表评论