Почему мой метод делегата NSView не вызывается? - PullRequest
1 голос
/ 18 декабря 2011

Я работаю над своим первым приложением для Mac, и у меня возникли некоторые проблемы с получением моего NSView и его методов делегата для работы.У меня есть NSViewController, который должен реагировать на события мыши, то есть mouseDown.Это не сработало, вместо этого я создал собственный подкласс NSView, который выглядит следующим образом:

// 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];
}

Соответствующие части NSViewController, которые должны действовать как делегат 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");
}

Теперь метод mouseDown не вызывается, что я делаю не так?

Ответы [ 2 ]

5 голосов
/ 18 декабря 2011

Если вы хотите, чтобы подкласс NSView принимал события, вам придется реализовать:

 - (BOOL)acceptsFirstResponder {
     return YES;
 }

как задокументировано здесь .

1 голос
/ 19 декабря 2011

Создание представления программно вместо этого сработало. Как это:

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