2013-02-01 45 views
2

有沒有辦法讓編譯器忽略這個特定的警告?如何忽略「UIViewController可能不會響應[方法]」警告

這是我做的:

UIViewController *firstViewController = AppDelegate.instance.viewController; 

//open the view of the clicked subItem 
if ([firstViewController respondsToSelector:@selector(openView:inView:)]) { 
    [firstViewController openView:subItem.itemText.text inView:activeScreen]; //warning on this line 
} 

我知道,工作是改變UIViewControllerViewController(它的類的名稱)的一種方式。但是這個修補程序在將來不會起作用,所以我只是在尋找一種方法來忽略這個警告。

它不會在今後的工作,因爲,我會做這樣的事:

//.m 

UIViewController *firstViewController; 

//.h 

if (someCondition) { 
firstViewController = AppDelegate.instance.viewController; 
} 
else{ 
firstViewController = AppDelegate.instance.otherViewController; 
} 

if ([firstViewController respondsToSelector:@selector(openView:inView:)]) { 
    [firstViewController openView:subItem.itemText.text inView:activeScreen]; //warning on this line 
} 
+0

「但是這種修復方法在未來不能使用」 - 爲什麼不呢?你應該這樣做*。* – 2013-02-01 17:08:34

+0

@ H2CO3更新了我的問題。 –

+0

謝謝。你可以扔掉那個物體(看我的答案)。 – 2013-02-01 17:16:06

回答

3

您應該在適當的位置將對象轉換爲正確的類型。請注意,如果你願意,你可以'轉換'爲協議。 這樣可以讓您安全地知道所需方法的實施,而無需知道具體的類型。

如果你只想讓編譯器不抱怨,可以通過調用performSelector:但是,你不會得到編譯時檢查。

[object performSelector:@selector(doSomething)]; 

見討論:Using -performSelector: vs. just calling the method

如果你想只有一個對象傳遞給你的選擇,它通過使用變異performSelector:withObject:是可能的。

如果您想傳遞多個對象,則必須將它們包裝在容器對象中,如iOS - How to implement a performSelector with multiple arguments and with afterDelay?所述。

+0

而且你也不能有多個參數。 – 2013-02-01 17:18:47

+0

是的。與此我不能有參數 –

+0

我認爲這是我的問題的最佳解決方案。謝謝。 –

1

在這種情況下,你可以發出一個明確的類型轉換(CAST):

UIViewController *firstViewController; 
// ... 

[(FirstViewController *)firstViewController openView:subItem.itemText.text inView:activeScreen]; 
0

確保導入FirstViewController.h,以便編譯器知道該方法。稍微調整你的代碼:

UIViewController *vc = AppDelegate.instance.viewController; 

//open the view of the clicked subItem 
if ([vc respondsToSelector:@selector(openView:inView:)]) { 
    FirstViewController *firstViewController = (FirstViewController *) vc; 
    [firstViewController openView:subItem.itemText.text inView:activeScreen]; 
} 

這應該有所斬斷。

+0

只需閱讀您的更新。不要擔心未來,在iOS上,您將不會動態鏈接該代碼。你不需要防範曾經存在但不再存在的方法,或者未來可能存在的新方法。 Apple會這樣做,因爲您正在動態鏈接到他們的框架。你的iOS代碼永遠無法做到這一點(Mac代碼可以)。 – Dave