2017-11-21 3 views
0

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?

Antwort

0

Das Problem gefunden! Wenn Sie den zu spielenden Sound zuweisen, müssen Sie den Sound-Delegaten mit [theSnd setDelegate: self] festlegen; Wenn der Sound nicht mehr abgespielt wird, wird der Delegat aufgerufen. In diesem Fall befindet sich der Delegat in der MyClass-.m-Datei.

0

Ich glaube, Sie sollten den Delegatobjekt wie mitteilen:

if([_delegate respondsToSelector:@selector(sound: didFinishPlaying:)]) 
    [_delegate sound:self didFinishPlaying:_flag]; 

Hope this Ihnen helfen.

+0

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

+0

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