在iOS 4之前,我曾經爲添加到地圖視圖中的每個MKAnnotationView
添加了一個觀察者,監聽它的選定方法,因此我知道用戶何時點擊了某個圖釘。如何測試方法的協議?
這工作正常到iOS 4.2。我注意到,在發佈的註釋視圖實際上被重用,並以某種方式與觀察者混淆。
因此,我想我可以使用MKMapViewDelegate
中的-mapview:didSelectAnnotationView:
方法來滿足我的需求,但這只是添加到iOS 4.0 SDK中。
因此,爲了保持兼容性,我想在我的代理上實現此方法,並有條件地檢查MKMapViewDelegate
協議中是否存在此方法,以便如果它不存在,我將添加我的觀察者到註釋視圖。
我該如何做一個協議方法,類似於我們如何檢查一個類是不是零?
UPDATE:
正如丹尼爾Dickison指出的那樣,我不能使用respondsToSelector:
,因爲我的委託已實施了4.0+設備-mapview:didSelectAnnotationView:
。我需要的是檢查該設備上的協議是否有可選-mapview:didSelectAnnotationView:
方法或如果MKMapView
將在其代理上查找該方法。
我結束了對當前運行的iOS版本的測試。如果它高於4.0,MKMapView
將查找該方法並調用它。
if ([[[UIDevice currentDevice] systemVersion] doubleValue] < 4.0)
[self setupObserver];
這解決了原來的問題,但它仍然將是有趣的檢查實際協議的方法,不知何故。
克里斯 - 你可能不想使用保留關鍵字選擇SEL作爲變量名稱。 – DHamrick 2010-11-24 21:34:48
@DHamrick,你是絕對正確的......很愚蠢......我很快就寫下了它,並有一個臉掌... – 2010-11-24 23:02:47
你不能使用「respondsToSelector」,因爲你會問它的唯一對象是你自己!你需要知道MKMapView是否會從委託中尋找這種方法... – 2010-11-24 23:14:39