• 2013-04-14

    Cocoa处理JSON转换, 兼谈计算机语言的哲学

    Views: 14782 | 3 Comments

    用了下 Objective-C Cocoa 里的 JSON 相关类 NSJSONSerialization, 发现简单的事情突然变得太复杂了. 想想用 php 语言的时候, 如果想把 php 语言对象转成字符串, 直接 json_encode(); 如果想把网络或者文件中的一段二进制数据(JSON 字符串)转成 php 对象, 直接 json_decode().

    但是, 在 Cocoa 里就不那么直接了. 首先, 你会遇到字符编码的问题, 所以你得到的和操作的不能是字符串, 而是 NSData. 其次, NSJSONSerialization 无谓地增加了限制, 顶层 Objective-C 对象只能是数组和字典.

    我不想探讨这里面的原因, 我当然知道这里面的原因, 我只是说, 这些原因可以避免.

    第一, 为解决后一个限制, 我可以做一些封装, 支持语言的整数对象和字符串对象(非常重要)直接转成 JSON 字符串, 而忽略所谓的 NSData(后面讲为什么 NSData 不是一个好东西).

    Continue reading »

    Posted by ideawu at 2013-04-14 15:51:29
  • 2013-04-08

    Mac SVG 图片转成 PNG

    Views: 10557 | No Comments
    qlmanage -t -s 512 -o ./output_dir file.svg
    

    -s: size in pixel
    -o: ouput dir

    修改图片格式

    sips -s format jpeg file.png --out ./output_dir
    
    Posted by ideawu at 2013-04-08 20:03:31
  • 2013-04-06

    Cocoa 应用检测 ESC 按键

    Views: 13976 | No Comments

    苹果 MacOSX 程序中如果要检测 ESC 按键, 可不是那么简单. 虽然 NSResponder(包括 NSView 及其子类) 有 keyDown: 方法可以实现, 但如果用户是在输入控件中敲键盘, 那么即使你在 NSWindowController 中也无法检测到 ESC 按键. 似乎 Cocoa 对 ESC 键做了特殊处理.

    而且, 有时你希望在整个 App 中检测按键, 而不是只对于当前一个窗口(key window), 那该怎么办? 解决方法是利用事件监听器(Event Monitor).

     1  @interface MyController : NSWindowController{
     2      id eventMonitor;
     3  }
     4  @end
     5
     6  @implementation MyController
     7  - (void)windowDidLoad{
     8      NSEvent* (^handler)(NSEvent*) = ^(NSEvent *theEvent) {
     9          NSWindow *targetWindow = theEven.window;
    10          if (targetWindow != self.window) {
    11              return theEvent;
    12          }
    13
    14          NSEvent *result = theEvent;
    15          NSLog(@"event monitor: %@", theEvent);
    16          if (theEven.keyCode == 53) {
    17              [self myProcessEscKeyDown];
    18              result = nil;
    19          }
    20
    21          return result;
    22      };
    23      eventMonitor = [NSEvent addLocalMonitorForEventsMatchingMask:NSKeyDownMask handler:handler];
    24  }
    25
    26  - (void)windowWillClose:(NSNotification *)notification{
    27      [NSEvent removeMonitor:eventMonitor];
    28  }
    @end
    

    上面的示例代码中做了判断, 只对当前控制器管理的窗口的事件进行处理, 如果你要实现程序级别的监听, 就不对窗口进行判断, 并且把上面的代码放在 NSApplicationDelegate 的子类里.

    Posted by ideawu at 2013-04-06 17:13:33 Tags: ,
|<<<12345>>>| 5/5 Pages, 27 Results.