2013-03-10 10 views
16

Ich habe viele Fragen zum Erstellen einer plattformübergreifenden Bibliothek für diese beiden Systeme gelesen. Jede Antwort verweist auf die statische Bibliothek als Lösung.Erstellen einer plattformübergreifenden iOS/OS X-Klasse

Ich will nicht mit einer statischen Bibliothek, um am Ende, würde Ich mag eine Klasse mit Methoden für iOS und ihr Pendant für OS X ist

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

Das erste Problem, das ich habe erstellen dass ich keine Möglichkeit finde, Klassen zu verwenden, die nur in einem bestimmten System verfügbar sind. Wie könnte ich zum Beispiel eine Funktion verwalten, die mit UIColor in iOS und mit NSColor in OS X funktioniert?

Wenn ich ein Projekt für iOS erstellen, wenn ich in Foundation.h aussehen kann ich nicht NSColor.h in der Header-Liste finden.

Ich dachte, die TARGET_OS_MAC und TARGET_OS_IPHONE Definitionen zu verwenden, um zwischen den beiden Systemen zu unterscheiden ... Ich bin auf dem richtigen Weg?

EDIT weitere Informationen hinzuzufügen:

Im Moment habe ich 2 Ziele: eine iOSTestApp und OSxTestApp. Für diese Ziele habe ich je nach System die benötigten Frameworks eingebunden.

Die Verwendung von TARGET_OS_MAC und TARGET_OS_IPHONE funktioniert nur, wenn ich die OSXTestApp als aktives Ziel auswähle. Wenn ich die iOSAppTest wählen, kehrt Xcode Fehler für OS X-Datentyp (dh NSColor)

Hier ein Beispiel für den Code, der diese Fehler erzeugt:

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

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

#endif 

Während, wenn ich die Definitionen invertieren es funktioniert .. . Hier ist ein Beispiel für den Code , die diese Fehler erzeugt:

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

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

#endif 
+0

antwortete, dass Sie eine statische lib für IOS benötigen - der Rest Ihrer Frage bekomme ich nicht –

+0

Ich kann nicht verstehen, die Abstimmung unten. Trotzdem möchte ich keine dynamische Bibliothek erstellen ... Wenn ich Ihnen gesagt habe, dass ich eine Helper Class Multi-Plattform erstellen will, klingt es besser? – MatterGoal

+0

, weil die Frage für mich wirklich unklar ist und Ihr Kommentar nicht hilft: D der Titel ist "eine nicht statische Bibliothek erstellen", während Sie sagen, dass ich nicht eine dynamische Bibliothek möchte: D –

Antwort

20

Die Probleme, die Sie aus der Tatsache entstehen, sind zu sehen, dass TARGET_OS_IPHONE als eine Variante des TARGET_OS_MAC definiert ist. (Mit anderen Worten, TARGET_OS_IPHONE ist ein spezifischerer Fall von TARGET_OS_MAC. Oder TARGET_OS_MAC ist ein Rechteck wie TARGET_OS_IPHONE ist ein Quadrat).

Also der folgende Code Fehler beim Kompilieren für iOS, weil iOS würde beide dieser Bedingungen übereinstimmen, aber NSColor ist nicht für iOS definiert.

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

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

#endif 

Der folgende Code funktioniert für beide, weil für iOS, es stimmt mit dem ersten Fall und für Mac OS X, ist es nicht das erste Spiel, aber die zweite entspricht.

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

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

#endif 
4

die beiden definiert Sie sprechen über auf 1 gesetzt sind oder 0 je nachdem, was Sie kompilieren für! (Bei der Kompilierung)

so sind Sie auf dem richtigen Weg hier denke ich

z.B.

#if TARGET_OS_IPHONE 
#import <CoreText/CoreText.h> 
#elif TARGET_OS_MAC 
#import <ApplicationServices/ApplicationServices.h> 
#endif 
5

Wenn es um UIColor/NSColor kommt, ich handhabe es so:

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

Dann in Header-Dateien, und wenn Sie nur Instanzen um geben, können Sie nur zum Beispiel verwenden ImageClassName *.

Wiederholen Sie den Block #if in Ihrem Code, wenn Sie die UIColor/NSColor-APIs verwenden müssen.

+0

Wow, diese Idee ist fantastisch! Danke, habe meinen Speck gerettet. – SpaceDog

Verwandte Themen