2012-06-04 2 views
0

У меня есть PGMidi.h со следующим делегатомДелегаты между классом и viewController.m

@protocol PGMidiSourceDelegate 
- (void) midiSource:(PGMidiSource*)input midiReceived:(const MIDIPacketList *)packetList; 

Тогда в моей viewController.m я просто хочу, чтобы получить NSLog при вызове делегата так

@interface viewController() <PGMidiDelegate, PGMidiSourceDelegate> 

@end 

@implementation viewController; 

- (void) midiSource:(PGMidiSource*)midi midiReceived:(const MIDIPacketList *)packetList 
{ 
    NSLog(@"test"); 
} 

I знаю, что делегат работает, потому что в PGMidi класс I также размещен

- (void) midiSource:(PGMidiSource*)midi midiReceived:(const MIDIPacketList *)packetList 
{ 
NSLog(@"test"); 
} 

и он работает.

Но по какой-то причине он не общается с viewController.m. Я также объявляю класс @PGMidi в заголовке. Но, возможно, мне нужно импортировать весь PGMidi.h?

ответ

1

В вашем PGMidi.h вы фактически должны объявить свойство делегата, т.е.

@property (nonatomic, assign) id<PGMidiSourceDelegate> delegate; 

Убедитесь в том, что synthesize свойство в файле PGMidi.m. Затем, в вашем PGMidi.m вы должны делать это:

-(void) midiSource:(PGMidiSource*)midi midiReceived:(const MIDIPacketList *)packetList { 
    [delegate midiSource:midi midiReceived:packetList]; 
} 

Вы также должны фактически установить контроллер представления в качестве делегата от вашего объекта PGMidi:

myPGMidi.delegate = myViewController; 
+1

Мне всегда было интересно об этом; что означает «присваивание»? Я читал документы яблока и другие вопросы, но я не могу понять его смысл. – pasawaya

+1

Назначение представляет собой слабую ссылку - в этом случае, поскольку ваш контроллер просмотра уже сохранен в памяти, нам не нужно увеличивать количество удержаний объекта, делая его сильным свойством. Во многих случаях, если вы не используете слабую ссылку в настройке делегата, вы можете создать цикл сохранения. проверьте http://stackoverflow.com/questions/918698/why-are-objective-c-delegates-usually-given-the-property-assign-instead-of-retai –

0

ли включать вы @end заключить ваш код @protocol PGMidiSourceDelegate в PGMidi.h? Также убедитесь, что в viewController.h вы говорите @interface viewController : (parentClass) <PGMidiSourceDelegate. (parentClass) - это класс, наследуемый классом viewController. В основном, ваша проблема заключается в том, что вы забыли @end или не указали, что viewController является делегатом PGMidi.h.

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