Ich aktualisiere einen älteren Ziel-C-Code, um unter OSX 10.13 kompiliert werden zu können. Der Legacy-Code funktionierte und der Großteil des Update-Codes funktioniert genauso gut, mit Ausnahme von NSSoundDelegate, das eine didFinishPlaying-Funktion verarbeiten muss. Die Delegate-Methode wird nicht aufgerufen. Die Delegate-Methode ist in einer Klasse namens MyClass enthalten. Hier ist der relevante Code.NSSoundDelegate wird nicht aufgerufen
In MyClass.h:
@class MyClass;
@protocol MyClass <NSObject>
@optional
- (void)sound:(NSSound *)sound didFinishPlaying:(BOOL)flag;
@end
@interface MyClass : NSObject <NSSoundDelegate>
{
}
@property (nonatomic, assign) id <NSSoundDelegate> delegate;
- (void)sound:(NSSound *)sound didFinishPlaying:(BOOL)flag;
- (id) init;
@end
Dann in MyClass.m:
@implementation MyClass
@synthesize delegate;
- (void)sound:(NSSound *)sound didFinishPlaying:(BOOL)flag
{
if (flag) {
[[NSNotificationCenter defaultCenter] postNotificationName:@"handleNSSoundDidFinishPlaying" object:sound];
}
}
- (id)init
{
MyClass *thePointer;
self = [super init];
if (self) {
thePointer = self;
self.delegate = (id)thePointer;
isInitialized = NO;
isClosing = NO;
[self set_currentSounds:[NSMutableArray arrayWithCapacity:0]];
}
return self;
}
@end
Kann jemand sehen, was mir fehlt?
Danke, dass Sie sich die Zeit genommen haben, ein Interesse auszudrücken. Ich bin mir nicht sicher, ob ich Ihren Vorschlag verstehe. Die NSSound-Delegatmethode (didFinishPlaying) wird nicht aufgerufen. Innerhalb meiner Implementierung der Delegate-Methode werde ich eine Benachrichtigung für den Code in MyClass ausgeben, den die Delegate-Methode ausgeführt hat, und andere Aufgaben, die sich auf das Ende der Soundwiedergabe beziehen, müssen abgeschlossen sein. Ich komme jedoch nie zur Benachrichtigung, weil ich nie zur Delegiertenmethode komme. Ich verstehe nicht, wie Ihr Vorschlag dazu beiträgt, den Delegierten zum Kochen zu bringen, oder wo Sie Ihren Vorschlag platzieren sollten. – ScottHa
Ich modifizierte die Init wie folgt: thePointer = selbst; thePointer.delegate = (id) selbst; if ([Delegat antwortetToSelector: @selector (sound: didFinishPlaying :)]) { isInitialized = NO; isClosing = NEIN; [self set_currentSounds: [NSMutableArray ArrayWithCapacity: 0]]; }; und Ausführung erreicht isInitialized = NO. – ScottHa