Я работаю над своим первым приложением Mac, и у меня возникают проблемы с получением моего NSView и его методов делегирования. У меня есть NSViewController, который должен отвечать на события мыши, т. Е. MouseDown. Это не сработало, а я создал собственный NSView подкласс, который выглядит следующим образом:Почему мой делегатский метод 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];
}
The 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 не вызван, что я делаю неправильно?
Вы просто выделили и внесли свой взгляд, но как вы на самом деле выглядите? Не хотите ли вы IBOutlet для CanvasView, а затем подключить его через Interface Builder? Или, если вы хотите создать его программно, вам не нужно будет использовать initWithFrame: вместо просто init, а затем на самом деле поставить точку зрения где-нибудь? – Enchilada
@ Enchilada Я создал представление с IB как часть NSViewController.xib и назначил CanvasView как класс. Я добавляю представление viewConrollers в окно в моем делете приложения следующим образом: '// Вставить код здесь, чтобы инициализировать ваше приложение viewController = [[PaintViewController alloc] initWithNibName: @" PaintViewController "bundle: nil]; [[_window contentView] addSubview: viewController.view]; 'Здесь я должен установить делегат? В таком случае, как? :) – Anders
Вам не хватает [self setView: canvasView] в коде вашего сообщения? В противном случае, как диспетчер представлений знает, каково его мнение? Ну или вы можете сделать addSubview: viewController.canvasView в коде, который вы только что вложили в свой комментарий выше. – Enchilada