无法使用类型为void的rvalue初始化NSEvent *类型的参数

时间:2013-03-31 20:46:13

标签: objective-c

您好。我正在尝试监控用户在可可应用程序中按下的键。

我使用了这段代码:

 // this code works!
 CGEventMask keyboardMaskKeyDown = CGEventMaskBit(kCGEventKeyDown);

 keyboardEventresult = [NSEvent addGlobalMonitorForEventsMatchingMask:keyboardMaskKeyDown handler:^(NSEvent *keyboardEvent)
 {
      keyboardEventresult = keyboardEvent;
      _currentKeystr = [NSString stringWithFormat:@"%c",[[keyboardEvent characters]characterAtIndex:0]];
      NSLog(@"Pressed key: %@",_currentKeystr);
      [hiddentextfield setStringValue:[NSString stringWithFormat:@"%@",_currentKeystr]];
  }];

但问题是,当我改变时:

 addGlobalMonitorForEventsMatchingMask

 addLocalMonitorForEventsMatchingMask

我收到错误Cannot initialize a parameter of type NSEvent *(^)(NSEvent *_strong) with an rvalue of type void(^)(NSEvent *_strong)

Here你可以看到苹果正在做类似的事情

         _eventMonitor = [NSEvent addLocalMonitorForEventsMatchingMask:

        (NSLeftMouseDownMask | NSRightMouseDownMask | NSOtherMouseDownMask | NSKeyDownMask)

        handler:^(NSEvent *incomingEvent) 

有关如何解决此问题的任何想法?

1 个答案:

答案 0 :(得分:2)

错误消息告诉您传递了错误类型的参数。它期望NSEvent *(^)(NSEvent *_strong)(一个块采用NSEvent*类型的一个参数并返回NSEvent*),但是你传递的是void(^)(NSEvent *_strong)(一个块采用{{1}类型的参数{1}}并返回NSEvent*。请注意块的返回类型的差异 - 它们必须完全匹配。

要解决此问题,请让您的块返回void。根据{{​​3}},您需要“返回未修改的事件,创建并返回新的NSEvent对象,或返回nil以停止调度事件。”因此,在块的末尾添加NSEvent*语句,其中return <something>;是同一事件,新事件或<something>