2009-10-08 16 views

Odpowiedz

44

Dla zwykłych selektorów można używać respondsToSelector:. Nie jestem pewien, czy to zadziała dla nowego stylu dostępu do właściwości (jak się wydaje, że używasz w tym przykładzie). Aby sprawdzić, czy klasa odpowiada na dany selektor, użyj instancesRespondToSelector:.

+4

Właściwość getter jest metodą o nazwie pasującej do właściwości i bez żadnych argumentów (np. Bez końcowych dwukropków w podpisie). –

+2

Wow, Objective-C nie jest zwięzły, prawda? – devios1

+1

@chaiguy: Objective-C jest najdalej posuniętym zwięzkiem, jak to możliwe. Oto dowód: [Najdłuższa metoda Objective-C] (http://stackoverflow.com/a/15152232/2783780). – JVillella

30

Ups, uznał go:

if ([vc respondsToSelector:@selector(mapView)]) { 

    [[vc mapView] viewWillAppear:YES]; 

} 
+2

Można również użyć go na syntetyzowane metodami własności, takich jak 'setMapView:' –

+1

lub dowolna własność z akcesoriem i seterem. @property & @synthesize wykonuje większość pracy dla ciebie w większości przypadków. nie jestem pewien, czy twój getter nie jest standardem, na przykład @property (getter = notStandardGetter) NSString * aString; – pxl

32

Ponadto, jako Jason ponumerowane here, można również użyć NSSelectorFromString do dynamicznego sprawdzania w czasie wykonywania. Na przykład.

if ([self respondsToSelector:NSSelectorFromString(elementName)]) 
{ 
    [self setValue:elementInnerText forKey:elementName]; 
} 
+0

Nie sądzę, że to będzie działać tak, jak zamierzacie ... Zgodnie z dokumentacją NSSelectorFromString: https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Miscellaneous/Foundation_Functions/ Reference/reference.html # // apple_ref/c/func/NSSelectorFromString "Zauważ, że jeśli selektor nie istnieje, jest on rejestrowany, a nowo zarejestrowany selektor jest zwracany." Tak więc to 'if' sprawdza zawsze wartość true. – Stunner

+4

@Stunner - Mogę źle zrozumieć, ale dokumenty sugerują, że 'NSSelectorFromString' zawsze zwraca SEL, bez względu na to, czy jest zaimplementowany. Nie stanowi to problemu, ponieważ 'responseSToSelector:' sprawdza faktyczne sprawdzenie, które nas interesuje. – Robert

+0

Ah Widzę, ma sens, dzięki za wyjaśnienie. – Stunner

Powiązane problemy