2013-03-10 15 views
16

Ho letto un sacco di domande sulla creazione di una libreria multipiattaforma per questi 2 sistemi. Ogni risposta punta alla libreria statica come soluzione.Creazione di una classe multipiattaforma iOS/OS X

Non voglio finire con una libreria statica, mi piacerebbe creare una classe con metodi per iOS e la loro controparte per OS X.

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

Il primo problema che ho è che non riesco a trovare un modo per utilizzare le classi che sono disponibili solo in un sistema specifico. Quindi, ad esempio, come posso gestire una funzione che funziona con UIColor in iOS e con NSColor in OS X?

Se creo un progetto per iOS, quando guardo su Foundation.h non riesco a trovare NSColor.h nell'elenco di intestazioni.

Ho pensato di utilizzare le definizioni TARGET_OS_MAC e TARGET_OS_IPHONE per fare una distinzione tra i due sistemi ... Sono sulla buona strada?

EDIT per aggiungere ulteriori informazioni:

Al momento ho 2 obiettivi: un iOSTestApp e OSxTestApp. Per questi obiettivi ho incluso i quadri necessari a seconda del sistema.

L'utilizzo di TARGET_OS_MAC e TARGET_OS_IPHONE funziona solo quando si seleziona l'OSXTestApp come destinazione attiva. Quando seleziono l'iOSAppTest, Xcode restituisce gli errori di tipo di dati OS X (cioè NSColor)

Ecco un esempio del codice che produce questi errori:

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

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

#endif 

Mentre se invertire la definizioni funziona .. . Ecco un esempio del codice che produce questi errori:

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

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

#endif 
+0

ha risposto che è necessario un lib statico per IOS - il resto della domanda non ottengo –

+0

Non riesco a capire il voto negativo. Comunque non voglio creare una libreria dinamica ... Se ti dicessi che voglio creare una piattaforma multipla di classe Helper, suona meglio? – MatterGoal

+0

perché la domanda non mi è chiara e il tuo commento non aiuta: D il titolo è "creare una libreria non statica" mentre dici "Non voglio una lib dinamica": D –

risposta

20

I problemi che stai vedendo sorgere dal fatto che TARGET_OS_IPHONE è definita come una variante di TARGET_OS_MAC. (In altre parole, TARGET_OS_IPHONE è un caso più specifico di TARGET_OS_MAC. Oppure TARGET_OS_MAC è in un rettangolo come TARGET_OS_IPHONE in un quadrato).

Quindi il seguente codice errore durante la compilazione per iOS perché iOS corrisponderebbe a entrambe le condizioni, ma NSColor non è definito per iOS.

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

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

#endif 

Il seguente codice funziona correttamente per sia perché per iOS, che corrisponde al primo caso, e per Mac OS X, non corrisponde al primo, ma fa corrispondere al secondo.

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

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

#endif 
4

due definisce si parla sono impostati a 1 o 0 a seconda di cosa si compila per! (Al momento della compilazione)

così si è sulla strada giusta qui immagino

esempio

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

Quando si tratta di UIColor/NSColor, mi occupo in questo modo:

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

Poi, nel file di intestazione, e se siete solo di passaggio casi in giro, si può semplicemente usare per esempio ImageClassName *.

Ripetere il blocco #if nel codice quando è necessario utilizzare le API UIColor/NSColor.

+0

wow, quell'idea è fantastica! Grazie, ho salvato il mio bacon. – SpaceDog

Problemi correlati