self.delegate antwortetToSelector: ... kompiliert nicht
Habe ich implementiert ein Protokoll mit einer optionalen Methode, und in der aufrufenden Methode, die ich senden möchten respondsToSelector:
zu self.delegate
bevor ich die Nachricht zu senden, aber nicht kompilieren. Die nicht-bestanden-Meldung ist:
Keine Bekannten Instanz-Methode für Auswahl - 'respondsToSelector'.
Als work-around, ich "sanitized" die delegieren, wie unten gezeigt, die kompiliert...
//MyClass.h:
@class MyClass;
@Protocol MyClassDelegate
- (void)myClass:(MyClass *)sender willDoSomething:(BOOL)animated;
@end
@interface MyClass : UIViewController
@property (nonatomic, weak) id<MyClassDelegate> delegate;
@end
und
//MyClass.m:
...
@synthesize delegate = _delegate;
...
id sanitizedDelegate = self.delegate; //Hmmmm... why does this work?
if ([sanitizedDelegate respondsToSelector:@selector(myClass:willDoSomething:)]) {
[self.delegate myClass:self willDoSomething:animated];
}
.
Ich überprüft eine Reihe von posts mit diese eine aber es gibt keine Antwort auf die compilation fail " - Problematik.
Außerdem werden alternative Zugriffsmethoden nicht funktionieren...
[self delegate]
//or
_delegate
Hat jemand diese gesehen oder kann Sie beraten, eine bessere Art des Umgangs?
IOS 5.0:(9A334), Xcode 4.2.1 (4D502)
InformationsquelleAutor der Frage vmanjz | 2012-03-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
-respondsToSelector:
ist eine Methode, die auf NSObject. Entweder davon ausgehen, dass Ihreid
delegieren, ist in der Tat ein NSObject, und es Stimmen:[(NSObject*)self.delegate respondsToSelector:@selector(myClass:willDoSomething:)]
Oder, besser noch, machen Sie Ihre Delegierten ausdrücklich ein NSObject:
@property (nonatomic, weak) NSObject<MyClassDelegate>* delegate;
Oder stellen Sie das Protokoll ein sub-Protokoll NSObject:
@protocol MyClassDelegate <NSObject>
InformationsquelleAutor der Antwort Kurt Revis
Im Grunde sagen Sie, dass Ihre Stellvertretung ist begrenzt nur durch Ihre
<MyClassDelegate>
Protokoll, so geht der compiler davon aus, dass diese sind die einzigen Methoden zur Verfügung. Was Sie tun müssen, haben das Protokoll erweitern<NSObject>
etwa so:Diese Weise weiß der compiler, dass jedes Objekt entspricht Ihrem Protokoll entspricht ebenfalls der
<NSObject>
Protokoll, welches definiertrespondsToSelector:
.InformationsquelleAutor der Antwort NJones