私は最初の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
サブクラスがイベントを受け入れる場合
あなたはあなたのビューを割り当てて入れただけですが、実際にあなたのビューをどのように表示させますか? IBOutletをCanvasViewに接続してInterface Builder経由で接続したいのですか?または、プログラムで作成したい場合は、単にinitの代わりにinitWithFrame:を使用しないで、実際にビューをどこかに置く必要はありませんか? – Enchilada
@ Enchilada NSViewController.xibの一部としてIBでビューを作成し、そのクラスとしてCanvasViewを割り当てました。私はこのように、アプリケーションのデリゲートのウィンドウにviewConrollersビューを追加します: '//ここにコードを挿入してアプリケーションを初期化します。 viewController = [[PaintViewController alloc] initWithNibName:@" PaintViewController "bundle:nil]; [[_window contentView] addSubview:viewController.view]; 'ここでデリゲートを設定する必要がありますか?その場合、どうですか? :) – Anders
あなたの投稿のコードに[self setView:canvasView]がありませんか?それ以外の場合は、ビューコントローラはビューの内容をどのように知っていますか?まあ、または上記のコメントに貼り付けたコードでaddSubview:viewController.canvasViewを実行することもできます。 – Enchilada