NSObject
hat keine Eigenschaft mit dem Namen footer
, weshalb der Compiler beschweren wird. Eine ID zurück zu NSObject
zu werfen hilft nicht. Wenn Sie wissen, dass das Objekt immer ein benutzerdefiniertes Objekt sein wird, das Sie erstellt haben, können Sie es zurückwerfen und dann die Fußzeile aufrufen, und der Compiler wird sich nicht beschweren. Es ist am besten, tho tatsächlich zu überprüfen. Siehe das Beispiel unten (für das Beispiel nannte ich die Klasse, die die footer
Eigenschaft hat ViewWithFooter
, so umbenennen angemessen):
- (void)handleUnpresent:(NSNotification*)note
{
ViewWithFooter view = (ViewWithFooter*)[note object];
NSParameterAssert([view isKindOfClass:[ViewWithFooter class]]);
UIView* footer = [view footer];
// Do something with the footer...
NSLog(@"Footer: %@", footer);
}
Wenn Sie eine Reihe von nicht verwandten Klassen haben (dh nicht in der gleichen Klassenhierarchie) dass alle eine footer
Eigenschaft darstellen, würden Sie am besten bedient werden, indem Sie ein Protokoll mit der erforderlichen footer
-Eigenschaft erstellen und das Objekt auf das Protokoll im obigen Codebeispiel umwandeln und bestätigen, dass es auf den Selektor antwortet.
Hier ist ein Beispiel unter Verwendung des Protokolls:
@protocol ViewWithFooter <NSObject>
- (UIView*)footer; // this could also be a readonly property, or whatever
@end
- (void)handleUnpresent:(NSNotification*)note
{
id<ViewWithFooter> view = (id<ViewWithFooter>)[note object];
NSParameterAssert([view respondsToSelector:@selector(footer)]);
UIView* footer = [view footer];
// Do something with the footer...
NSLog(@"Footer: %@", footer);
}
Warum nicht zu den Schwierigkeiten gehen? ObjC-Klassen sind im Vergleich zu den meisten Sprachen relativ leicht und ermöglichen es Ihnen, die Fußzeileneigenschaft mit Null zu vergleichen. – CodaFi