2011-12-18 2 views
1

Я работаю над своим первым приложением 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 не вызван, что я делаю неправильно?

+0

Вы просто выделили и внесли свой взгляд, но как вы на самом деле выглядите? Не хотите ли вы IBOutlet для CanvasView, а затем подключить его через Interface Builder? Или, если вы хотите создать его программно, вам не нужно будет использовать initWithFrame: вместо просто init, а затем на самом деле поставить точку зрения где-нибудь? – Enchilada

+0

@ Enchilada Я создал представление с IB как часть NSViewController.xib и назначил 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

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

- (BOOL)acceptsFirstResponder { 
    return YES; 
} 

как описано here.

+0

Привет, события, похоже, работают внутри NSView. Например, '- (void) mouseDragged: (NSEvent *) событие { NSLog (@" Перетаскивание "); } 'Внутри NSView вызывается, но не так, если я делаю его методом делегата способом, который я описал. – Anders

+0

Итак, вы хотите, чтобы «NSViewController» обрабатывал события? Вам нужно будет вызвать 'setNextResponder:' для передачи событий контроллеру. Ваша структура делегирования - это не совсем то, что нужно делать здесь. Посмотрите руководство по управлению событиями в какао, в частности раздел о цепочке ответчиков: http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/EventOverview/EventArchitecture/EventArchitecture.html#//apple_ref/DOC/UID/10000060i-СН3-SW2 – paulbailey

Смежные вопросы