2012-11-14 42 views
0

我開發了一個用於滑動UIView的通用控制器,並且我管理UIViewController(顯然是子類),並且只有在UIViewController的子類響應此方法時才必須調用特定方法(凍結)將對象(UIViewController)投射到它們未知的子類

-(void)freezeRootViewController 
{ 
    if([_rootViewController respondsToSelector:@selector(freeze)]) 
     [ ((id) _rootViewController) freeze]; 
} 

我不知道類_rootViewController的,但我知道這是的UIViewController的一個子類,因爲這個原因我試圖我_rootViewController轉換爲ID,但我不能編譯:

環境:XCode 4.5.1,帶ARC的iOs 4.3+

錯誤:「不知道選擇器凍結的實例方法」

注意:我無法強制開發人員爲_rootViewController使用特定的UIViewController子類。

+0

這不是一個*警告*而不是一個錯誤? – 2012-11-14 17:34:09

+0

@ H2CO3不,XCode 4.5.1,帶ARC的iOs 4.3+不能編譯。 – Kappe

+0

看到我的答案,這應該有所幫助(順便說一下,使這個錯誤是無腦的)。 – 2012-11-14 17:37:17

回答

1

這似乎是一個警告而不是一個錯誤 - 你應該能夠編譯代碼,只是忽略這一診斷信息。但是,如果你想擺脫它完全,你可以聲明一個協議,做投如下:使用performSelector:

@protocol MyProtocol <NSObject> 

- (void)freeze; 

@end 

[(id <MyProtocol>)_rootViewController freeze]; 
+0

不,這是一個錯誤,但如果我只將協議添加到我的班級(沒有施放!!),所有工作都完美無缺!謝謝;) – Kappe

+0

@Kappe當你能夠這樣做時,請接受/ upvote我的答案,謝謝。 – 2012-11-14 17:44:39

+0

@ H2CO3:就像一個註釋:使用ARC,你不能編譯未知的方法選擇器。見例如http://lists.apple.com/archives/objc-language/2012/Jul/msg00114.html據說,這是一個故意的決定,這是一個錯誤,而不是一個警告。 –

2

檢查之後,如果「通用」類型響應一個選擇調用它/如果它是簡單的0-1參數方法,則使用。由於freeze沒有參數,因此您只需使用performSelector:

-(void)freezeRootViewController 
{ 
    if([_rootViewController respondsToSelector:@selector(freeze)]) 
     [_rootViewController performSelector:@selector(freeze)]; 
} 
+0

更優雅+1 – Kappe