2011-12-18 14 views
1

私は最初のMacアプリケーションで作業しています。私はNSViewを入手することにいくつか問題があり、それは動作する代理メソッドです。マウスイベントに応答する必要があるNSViewControllerがあります(mouseDownなど)。 、NSViewデリゲートメソッドが呼び出されないのはなぜですか?

#import "CanvasView.h" 

@interface PaintViewController : NSViewController <CanvasViewDelegate> 
{ 
    CanvasView *canvasView; 
} 

@property (strong) IBOutlet CanvasView *canvasView; 

@end 

@synthesize canvasView; 

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
    { 
     self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
     if (self) { 
     // Initialization code here. 
     canvasView = [[CanvasView alloc] init]; 
     canvasView.delegate = self; 
    } 

    return self; 
} 

- (void)mouseDown:(NSEvent *)event 
{ 
    NSLog(@"Down"); 
} 

// Delegate method 
@protocol CanvasViewDelegate 
    - (void)mouseDown:(NSEvent *)event; 
@end 

@interface CanvasView : NSView 
{ 
    id delegate; 
} 

@property (nonatomic, strong) id delegate; 
@end 

@implementation CanvasView 
@synthesize delegate; 

- (void)mouseDown:(NSEvent *)event 
{ 
    [delegate mouseDown:event]; 
} 

のNSViewのデリゲートは、次のようになりますよう行動しなければならないNSViewController関連する部分を:これは私がこのようになりますカスタムNSViewのサブクラスを作成した代わりに、動作しませんでしたメソッドmouseDownが呼び出されない、何が間違っている?あなたはNSViewサブクラスがイベントを受け入れる場合

+0

あなたはあなたのビューを割り当てて入れただけですが、実際にあなたのビューをどのように表示させますか? IBOutletをCanvasViewに接続してInterface Builder経由で接続したいのですか?または、プログラムで作成したい場合は、単にinitの代わりにinitWithFrame:を使用しないで、実際にビューをどこかに置く必要はありませんか? – Enchilada

+0

@ Enchilada NSViewController.xibの一部としてIBでビューを作成し、そのクラスとしてCanvasViewを割り当てました。私はこのように、アプリケーションのデリゲートのウィンドウにviewConrollersビューを追加します: '//ここにコードを挿入してアプリケーションを初期化します。 viewController = [[PaintViewController alloc] initWithNibName:@" PaintViewController "bundle:nil]; [[_window contentView] addSubview:viewController.view]; 'ここでデリゲートを設定する必要がありますか?その場合、どうですか? :) – Anders

+0

あなたの投稿のコードに[self setView:canvasView]がありませんか?それ以外の場合は、ビューコントローラはビ​​ューの内容をどのように知っていますか?まあ、または上記のコメントに貼り付けたコードでaddSubview:viewController.canvasViewを実行することもできます。 – Enchilada

答えて

1

ビューをプログラムで作成する代わりに、機能しました。このように:

NSRect canvasRect = self.view.frame; 
canvasView = [[CanvasView alloc] initWithFrame:canvasRect]; 
[self.view addSubview:canvasView]; 
canvasView.delegate = self; 
5

、あなたが実装する必要があります:hereを文書化

- (BOOL)acceptsFirstResponder { 
    return YES; 
} 

として。

+0

こんにちは、イベントは、NSViewだけで動作するようです。たとえば、 ' - (void)mouseDragged :(NSEvent *)イベント { NSLog(@"ドラッグ "); } 'NSViewの内部が呼び出されますが、私が説明した方法でデリゲートメソッドを作成する場合はそうではありません。 – Anders

+0

NSViewControllerがイベントを処理したいのですか?イベントをコントローラに渡すときに 'setNextResponder:'を呼び出す必要があります。あなたの委任パターンは本当にここでやるべきことではありません。 Cocoaイベントハンドリングガイド、特にレスポンダチェーンのセクションをご覧ください:http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/EventOverview/EventArchitecture/EventArchitecture.html#//apple_ref/doc/uid/10000060i-CH3-SW2 – paulbailey

関連する問題