2013-03-10 14 views
16

Przeczytałem wiele pytań na temat tworzenia biblioteki międzyplatformowej dla tych 2 systemów. Każda odpowiedź wskazuje na bibliotekę statyczną jako rozwiązanie.Tworzenie wieloplatformowej iOS/OS X klasy

Nie chcę skończyć ze statycznej biblioteki, chciałbym stworzyć klasę z metod iOS i ich odpowiedniki dla OS X.

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

Pierwszy problem, który mam jest że nie mogę znaleźć sposobu na użycie klas, które są dostępne tylko w określonym systemie. Na przykład, jak mogę zarządzać funkcją działającą z UIColor w systemie iOS i NSColor w systemie OS X?

Jeśli utworzę projekt dla iOS, gdy zagłębię się w Foundation.h, nie mogę znaleźć NSColor.h na liście nagłówków.

myślałem wykorzystać definicje TARGET_OS_MAC i TARGET_OS_IPHONE dokonać rozróżnienia między tymi dwoma systemami ... Jestem na dobrej drodze?

EDIT, aby dodać więcej info:

Obecnie mam 2 cele: AN iOSTestApp i OSxTestApp. Dla tych celów zawarłem potrzebne ramy w zależności od systemu.

Używanie TARGET_OS_MAC i TARGET_OS_IPHONE działa tylko wtedy, gdy wybiorę OSXTestApp jako aktywny obiekt docelowy. Kiedy wybrać iOSAppTest, Xcode zwraca błędy dotyczące typu danych OS X (tj NSColor)

Oto przykład kodu, który produkuje te błędy:

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

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

#endif 

Chociaż gdybym odwrócić definicje to działa .. . Oto przykład kodu, który produkuje te błędy:

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

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

#endif 
+0

odpowiedział, że potrzebujesz statycznej biblioteki dla IOS - pozostała część pytania Nie dostanę –

+0

Nie mogę zrozumieć głosowania w dół. W każdym razie nie chcę tworzyć biblioteki dynamicznej ... Jeśli powiedziałem Ci, że chcę utworzyć platformę dla wielu użytkowników klasy pomocniczej, czy to brzmi lepiej? – MatterGoal

+0

, ponieważ pytanie jest dla mnie niejasne, a komentarz nie pomaga: D tytuł to "tworzenie niestatycznej biblioteki", gdy mówisz "Nie chcę dynamicznej biblioteki": D –

Odpowiedz

20

Problemy widzisz wynikają z faktu, że TARGET_OS_IPHONE jest zdefiniowany jako wariant TARGET_OS_MAC. (Innymi słowy, TARGET_OS_IPHONE jest bardziej konkretnym przypadkiem: TARGET_OS_MAC lub TARGET_OS_MAC jest na prostokąt, ponieważ TARGET_OS_IPHONE jest na kwadracie).

Następujący błąd kodu podczas kompilacji dla systemu iOS, ponieważ iOS byłby zgodny z tymi dwoma warunkami, ale NSColor nie jest zdefiniowany dla systemu iOS.

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

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

#endif 

Poniższy kod działa poprawnie zarówno ze względu na iOS, pasuje pierwszy przypadek, a dla Mac OS X, to nie pasuje do pierwszej, ale nie pasuje do drugiego.

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

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

#endif 
4

dwa definiuje można mówić o są ustawione na 1 lub 0 w zależności od tego, co dla kompilacji! (W czasie kompilacji)

więc jesteś na dobrej drodze tutaj Chyba

przykład

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

Jeśli chodzi o UIColor/NSColor, ja sobie to tak:

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

Następnie w plikach nagłówkowych, a jeśli jesteś po prostu przechodząc wokół wystąpień, można po prostu użyć np ImageClassName *.

Powtórz blok #if w kodzie, gdy potrzebujesz użyć interfejsów API UIColor/NSColor.

+0

Wow, ten pomysł jest fantastyczny! Dzięki, uratowałem mój bekon. – SpaceDog

Powiązane problemy