2011-10-05 70 views
2

儘管在各地搜索,我找不到我的問題的答案。所以讓我們看看你們都有多好。 :)xib中的預處理器指令?

我正在使用NSPopover的應用程序,該應用程序僅在10.7 Lion中可用,但我希望應用程序能夠編譯爲10.5和更高版本。我正在使用預處理器指令來包裝相關的popover代碼,這看起來可以做到這一點......但是,我仍然遇到錯誤的最後一部分是Interface Builder中的.zib。如何清理在問題導航器中顯示的錯誤,指出「類不可用:10.7之前的Mac OS X版本上的NSPopover」?

#ifdef __MAC_OS_X_VERSION_MAX_ALLOWED 
    #if __MAC_OS_X_VERSION_MAX_ALLOWED >= 1070 
     @property (assign) IBOutlet NSPopover *popover; 
    } 
    #endif 
#endif 

上面的工作在xxx.h和xxx.m's中,但是如何解決.xib錯誤呢?

儘管出現錯誤(紅色),但它會成功建立。然而,我期望10.7的功能(popover)在10.7中工作,我錯了,因爲他們不......我在這裏錯過了什麼?

+1

您是否正在構建應用的兩個單獨版本,一個定位爲10.7+,一個定位爲<10.7?還是你正在構建一個單一的二進制文件,只有當它運行在10.7+上時,它才能在運行時動態創建一個'NSPopover'? –

+0

簡而言之,我希望創建一個運行在10.5 - 10.7的單個二進制文件,如果運行10.7,則使用NSPopover。 – glassfish

+0

@glassfish然後Citron的答案不是你想要的。預處理器在編譯時運行,無法檢測應用程序將在哪個版本的操作系統上運行。 – hypercrypt

回答

3

您不應該使用預處理器,但在運行時使用NSClassFromString()檢查可用性。預處理器在編譯時運行,因此它不會檢測應用程序在哪個系統上運行。

爲10.5,10.6和10.7中的每一個創建三個筆尖並加載所需的一個(或以代碼形式),但在運行時選擇哪一個,而不是編譯時間,例如,

MyVC *vc = nil; 
if (NSClassFromString(@"NSPopover")) 
{ 
    vc = [NSViewController initWithNibName:@"MyVC-Lion" bundle:nil]; 
} 
else if (/* check for 10.6+ only features */) 
{ 
    vc = [NSViewController initWithNibName:@"MyVC-SL" bundle:nil]; 
} 
else 
{ 
    vc = [NSViewController initWithNibName:@"MyVC" bundle:nil]; 
} 
// ... 
+1

+1真,這是要走的路。有些人不明白預處理器不會在運行時運行。 –

+0

沒錯,但你有N個廈門國際銀行保持...如果你決定要返工的共同部分,你就會有N次的工作要做。最終的應用程序將會更大。 所以,也許在你的情況/體驗它更好地做到這一點,在我自己的,我肯定更喜歡只管理1廈門國際銀行,並用一個小構建腳本來針對不同的平臺。在用戶界面更大,更痛苦的「N廈門國際銀行」的做法會。 編輯:此外,你可能可以通過動態檢查更換預處理器僅初始化10.7份在需要時(仍編程避免許多xibs) – Citron

+1

@Citron然後,只需使用您的部署目標支持的最複雜的NIB並添加留在代碼中,但不要使用運行時檢查而不要使用預處理器。你真的想爲同一個操作系統的不同版本管理多個應用程序嗎? – hypercrypt

1

對於您的問題,道歉,但可能的解決方法不是真正的答案:是不是可以創建xib的2個版本,並根據目標,編譯或其他?這需要更多的工作來維護,但如果你的UI非常穩定,這應該是最簡單的方法。

或者您可以編程方式添加您的「10.7特定」UI組件,而不是使用IB。如果你只有一個或幾個彈出,它不應該很難做到,並且這些輔助處理器的警衛工作正常。

+0

雖然我還沒有嘗試過,但對我來說這似乎是一個非常有效的方法。謝謝!我只是用Objective-C開始工作,這是我的第一個項目,所以是的,我非常喜歡noob,不太清楚我的選項。如何根據他們正在運行的操作系統版本動態加載元素的任何提示? – glassfish

+0

簡短回答:預處理器:)只需在IB中設置你的整個UI,然後爲10.7特定的東西,以編程方式添加它們,使用預處理器來檢測你正在構建的10.7或10.6和更低。 至於「如何以編程方式添加元素」,好吧,我認爲大多數(如果不是全部)可可控件(如NSButton等)從NSView繼承。 NSView有幾種方法可以完成你想要的功能:addSubview,removeFromSuperView等。:) – Citron

+1

這不會動態檢查,它需要你建立三個版本的應用程序! – hypercrypt