2013-03-31 24 views
1

的右值初始化NSEvent *類型的參數。我正在嘗試監視用戶在可可應用中按下的按鍵。無法使用類型爲void

我用這個代碼:

// 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) 

關於如何解決此問題的任何想法的東西嗎?

回答

2

錯誤消息告訴你,你傳遞了錯誤的參數類型。它的期望值爲NSEvent *(^)(NSEvent *_strong)(塊類型爲NSEvent*的一個參數,並返回NSEvent*),但是您傳遞的是void(^)(NSEvent *_strong)(塊類型爲NSEvent*,返回void,請注意塊的返回類型的區別 - 它們必須完全匹配。

要解決這個問題,讓你的塊返回NSEvent*。按照documentation,你需要「迴歸事件修改,創建並返回一個新NSEvent對象,或返回nil停止的調度事件。」因此,添加return <something>;語句將塊,其中<something>是相同的事件,新事件,或nil結束。

+0

謝謝,沒有注意到它:) – Jona

相關問題