2009-01-08 71 views
2

我目前正在編寫一個iPhone應用程序,它使用UITabBarController和5個以上的標籤欄項目。因此,會自動生成一個「更多」標籤(如在YouTube應用程序中)。 我發現相應的視圖控制器類是UIMoreListController,但我沒有任何對應的.h文件。因此,我的代碼如下所示:如何禁用前向類編譯器警告(無證類)

@class UIMoreListController; // can't use #import since .h file is missing 

@implementation SomeUINavigationControllerDelegate 

- (void)navigationController:(UINavigationController *)navigationController 
     willShowViewController:(UIViewController *)viewController 
     animated:(BOOL)animated 
{ 
    if ([viewController isKindOfClass:[UIMoreListController class]]) 
     ... // do something if "more" view is active 

這種方式就像一種魅力。然而,編譯器不斷給我

警告:接收機「UIMoreListController」是一個正向類和相應的@interface可能不存在

是否有擺脫這一警告的一種巧妙的方法(這隻有特定的警告)?再次,我不能使用#import,因爲沒有.h文件可用。

回答

10

如果您只是想檢查UIMoreListController類,則可以使用objc-api訪問類變量。

if ([viewController isKindOfClass:NSClassFromString(@"UIMoreListController")]) 

那麼你不需要#import@class聲明。

0

您不應該聲明或#import任何標準的Cocoa Touch類。 UIMoreListController看起來不像它是目前應該使用的公共類,如果它是在文檔中列出的話。您鏈接到的頁面是一個SDK轉儲,如果您計劃在App Store中發佈您的應用程序,則並非所有內容都可以安全使用。

儘管如此,您可以將其聲明爲類型ID,並且如有必要,可以使用任何需要調用的UIMoreListController特定方法在NSObject上聲明一個類別。

0

將其聲明爲類型ID,並且如有必要,請使用任何需要調用的UIMoreListController特定方法在NSObject上聲明一個類別。

這不會伎倆。我需要的只是

if ([viewController isKindOfClass:[UIMoreListController class]]) 

無論如何,你是正確的通過App Store發佈骯髒的黑客攻擊。不幸的是,the Reference is somewhat secretive about those moreNavigationControllers。他們告訴你,這只是一個UINavigationController(事實上,它是)。

也許我應該嘗試一種不同的方法來查明viewController是否是一些UIMoreListController。像

if ([viewController isEqual:[navigationController topViewController]]) 

應該工作,因爲UIMoreListController始終是topViewController。 (我可能是錯的,但我會嘗試)

0

你爲什麼要這麼做?你不應該使用任何私人API。不能保證這個類在下一個操作系統版本中仍然存在,如果你認爲它是這樣的話,那麼這條路會導致錯誤甚至崩潰。

+0

你是對的。我決定使用不同的方法: http://pastebin.com/f28191612 這足以檢測UIMoreListController,我希望。 – user123444555621 2009-01-14 15:27:54

0

只要你在moreNavigationController的代表是,這應該做的伎倆:

[viewController isEqual:[navigationController.viewControllers objectAtIndex:0]] 

相比之下,topViewController會給你的,你想的正好相反。使用objectAtIndex:0應該有助於避免任何私人詭計。