2011-03-31 58 views
-1

[更新之後FIRST AWNSER] 我試圖找到一種方法,使用和實施該keydown選項目的C.但是當我嘗試它,它總是失敗......的keydown在Objective-C

燦任何人都會給我舉例說明這是如何完成的。我明白Objective C很好,並不需要完整的解釋。

我刪除了-(void) keyDown中的方法,因爲它不起作用。

現在這是我的代碼:

#import <Cocoa/Cocoa.h> 

@interface ViewController : NSView { 
    IBOutlet id pressLabel; 
} 

@end 



#import "ViewController.h" 

@implementation ViewController 

-(BOOL) acceptsFirstResponder 
{ 
    return YES; 
} 

-(BOOL) becomeFirstResponder 
{ 
    return YES; 
} 

-(BOOL) resignFirstResponder 
{ 
    return YES; 
} 

-(void)keyDown:(NSEvent *)theEvent 
{ 
    NSString *theUpArrow = [NSString stringWithFormat:@"%c",NSUpArrowFunctionKey]; 
    if([[theEvent characters] isEqualToString:theUpArrow]){ 
     [pressLabel setStringValue:@"Pressed"]; 
    } else { 
     [super keyDown:theEvent]; 
    } 
} 

@end 

回答

7

keyDown:是NSResponder類的方法,通常在視圖中實現。這個類被命名爲Controller,它表明它不是視圖,因此不會收到關鍵事件。您可能想將其放入視圖中。

+2

@Muttur:查克說了什麼。查看[Responder Chain Doc](http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/EventOverview/EventArchitecture/EventArchitecture.html#//apple_ref/doc/uid/10000060i-CH3 -SW2)來理解爲什麼這個對象沒有得到'keyDown:'調用它。 – 2011-03-31 21:20:33

+0

我用我現在的課程更新了我的帖子。但它仍然行不通...怎麼了? – Muttur 2011-03-31 21:57:57

+1

你已經添加了一些能夠成爲第一響應者的支持,但你實際上並不在鏈中。看看' - [NSResponder setNextResponder:]'。 – 2011-03-31 23:13:52

1
[self keyDown:theEvent];  

這不會解決你的問題,但我認爲對於線之上,要使用super而不是self。如果您使用self,它將再次調用相同的方法,並且它會一直重複調用相同的方法,一旦沒有更多堆棧空間,就會崩潰應用程序。

+0

超級它不工作:我再次更新它,但它有可能你可以讓我一個項目或什麼?我非常絕望,在這裏發佈之前我一週都在工作。 – Muttur 2011-03-31 23:07:14

+2

@Muttur:'keyDown:'方法本身沒有任何問題。你的問題是你的對象不在響應者鏈中。閱讀下面鏈接的文檔,或閱讀[此解釋](http://iphonedevelopment.blogspot.com/2008/10/bit-about-responder-chain.html)並查看[NSResponder類參考](正如Ben所建議的那樣,http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ApplicationKit/Classes/NSResponder_Class/Reference/Reference.html)。這是你失蹤的一塊。 – 2011-04-01 04:07:41

+0

@Josh這不是關於iPhone的發展,我不知道如何NSResponder鏈接到我的NSEvent。我需要使用其他課程嗎?因爲我讀了一些關於NSTextView/NSTextField的內容。這是否需要? – Muttur 2011-04-06 13:48:50