16

これら2つのシステム用のクロスプラットフォームライブラリの作成に関する多くの質問を読みました。すべての答えは、解決策として静的ライブラリを指しています。

静的ライブラリで終わらせたくはありません。iOS用のメソッドとそれに対応するOSX用のメソッドを使用してクラスを作成したいと思います。

-(void)createColor:(NSColor*);
-(void)createColor:(UIColor*);

私が抱えている最初の問題は、特定のシステムでのみ利用可能なクラスを使用する方法が見つからないことです。たとえば、UIColoriOSとOSXで動作する関数をどのように管理できNSColorますか?

iOS用のプロジェクトを作成した場合、調べてみるとヘッダーリストにFoundation.h見つかりません。NSColor.h

TARGET_OS_MACTARGET_OS_IPHONE定義を使用して2つのシステムを区別しようと思いました...私は正しい方向に進んでいますか?

より多くの情報を追加するために編集:

現在、iOSTestAppとOSxTestAppの2つのターゲットがあります。これらのターゲットには、システムに応じて必要なフレームワークを含めました。

OSXTestAppをアクティブターゲットとして選択した場合にのみ、を使用して機能しますTARGET_OS_MACTARGET_OS_IPHONEiOSAppTestを選択すると、XcodeはOS Xデータ型のエラーを返します(つまりNSColor

これらのエラーを生成するコードの例を次に示します。

#if TARGET_OS_MAC
-(void)createColor:(NSColor*)color;    

#elif TARGET_OS_IPHONE
-(void)createColor:(UIColor*)color;

#endif

定義を逆にすると機能しますが...これらのエラーを生成するコードの例を次に示します。

#if TARGET_OS_IPHONE
-(void)createColor:(UIColor*)color;

#elif TARGET_OS_MAC
-(void)createColor:(NSColor*)color;

#endif
4

3 に答える 3

22

TARGET_OS_IPHONE表示されている問題は、のバリアントとして定義されているという事実から発生しますTARGET_OS_MAC。(言い換えると、TARGET_OS_IPHONEはより具体的なケースですTARGET_OS_MAC。または、正方形に対するのとTARGET_OS_MAC同じように長方形に対するものです)。TARGET_OS_IPHONE

したがって、iOSはこれらの条件の両方に一致しますが、NSColoriOSには定義されていないため、iOS用にコンパイルすると次のコードがエラーになります。

#if TARGET_OS_MAC
-(void)createColor:(NSColor*)color;    

#elif TARGET_OS_IPHONE
-(void)createColor:(UIColor*)color;

#endif

次のコードは、iOSの場合は最初のケースと一致し、Mac OS Xの場合は最初のケースとは一致しませんが、2番目のケースと一致するため、両方で正しく機能します。

#if TARGET_OS_IPHONE
-(void)createColor:(UIColor*)color;

#elif TARGET_OS_MAC
-(void)createColor:(NSColor*)color;

#endif
于 2013-03-10T16:03:06.163 に答える
5

UIColor / NSColorに関しては、次のように処理します。

#if TARGET_OS_IPHONE
#define ImageClassName UIImage
#else
#define ImageClassName NSImage
#endif

次に、ヘッダーファイルで、インスタンスを渡すだけの場合は、たとえばを使用できますImageClassName *

#ifUIColor / NSColor APIを使用する必要がある場合は、コード内でブロックを繰り返します。

于 2013-03-12T00:35:24.290 に答える
4

あなたが話している2つの定義は、コンパイル対象に応じて1または0に設定されます。(コンパイル時)

だからあなたはここで正しい軌道に乗っていると思います

例えば

#if TARGET_OS_IPHONE
#import <CoreText/CoreText.h>
#elif TARGET_OS_MAC
#import <ApplicationServices/ApplicationServices.h>
#endif
于 2013-03-10T14:20:51.167 に答える