2013-03-10 2 views
16

Я прочитал много вопросов о создании кросс-платформенной библиотеки для этих двух систем. Каждый ответ указывает на статическую библиотеку в качестве решения.Создание межплатформенного класса iOS/OS X

Я не хочу, чтобы в конечном итоге с статической библиотеки, я хотел бы создать класс с методами прошивкой и их аналог для OS X.

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

Первая проблема, что у меня есть что я не могу найти способ использовать классы, доступные только в определенной системе. Например, как я могу управлять функцией, которая работает с UIColor в iOS и с NSColor в OS X?

Если я создаю проект для iOS, когда я смотрю Foundation.h Не удается найти NSColor.h в списке заголовков.

Я думал использовать определения TARGET_OS_MAC и TARGET_OS_IPHONE, чтобы провести различие между двумя системами ... Я на правильном пути?

EDIT, чтобы добавить больше информации:

На данный момент у меня есть 2 цели: iOSTestApp и OSxTestApp. Для этих целей я включил необходимые рамки в зависимости от системы.

Использование TARGET_OS_MAC и TARGET_OS_IPHONE работает только при выборе OSXTestApp в качестве активной цели. Когда я выбираю iOSAppTest, 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 
+0

ответил, что вам нужна статическую Библиотека для IOS - остальная часть вашего вопроса я не получаю –

+0

я не могу понять вниз голосование. В любом случае я не хочу создавать динамическую библиотеку ... Если бы я сказал вам, что хочу создать мультиплатформу класса Helper, это звучит лучше? – MatterGoal

+0

, потому что вопрос действительно неясен для меня, и ваш комментарий не помогает: D название «создает нестационарную библиотеку», в то время как вы говорите «Я не хочу динамическую библиотеку»: D –

ответ

20

Проблемы которые вы видите возникают из-за того, что TARGET_OS_IPHONE определяется как вариант TARGET_OS_MAC. (Другими словами, TARGET_OS_IPHONE является более конкретным случаем TARGET_OS_MAC. Или TARGET_OS_MAC представляет собой прямоугольник, так как TARGET_OS_IPHONE соответствует квадрату).

Таким образом, при компиляции для iOS возникают следующие ошибки кода, поскольку iOS будет соответствовать обоим этим условиям, но NSColor не определен для iOS.

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

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

#endif 

Следующий код работает правильно для обоего, потому что для прошивки, это соответствует первому случаю, так и для Mac OS X, он не совпадает с первым, но делает матч второго.

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

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

#endif 
4

два определяет вы говорите о настроены на 1 или 0 в зависимости от того, что вы собираете для сравнения! (Во время компиляции)

так вы на правильном пути, здесь я думаю

например

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

Когда дело доходит до UIColor/NSColor, я справиться с этим, как это:

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

Затем, в заголовочных файлах, и если вы просто проездом экземпляры вокруг, вы можете просто использовать, например, ImageClassName *.

Повторите #if блок в коде, когда вам нужно использовать UIColor/NSColor API.

+0

Вау, эта идея фантастическая! Спасибо, спас мой бекон. – SpaceDog

Смежные вопросы