2013-03-10 21 views
16

Bu 2 sistem için platformlar arası kitaplık oluşturmayla ilgili birçok soru okuyorum. Her cevap, çözüm olarak statik kütüphaneye işaret eder.Bir iOS/OS X çapraz platform sınıfı oluşturma

ben statik kütüphane ile sona istemiyorum, ben OS X

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

I gereken ilk sorun için iOS için yöntem ve bunların muadili olan bir sınıf oluşturmak istiyorum Sadece belirli bir sistemde kullanılabilen sınıfları kullanmanın bir yolunu bulamıyorum. Örneğin, iOS'ta UIColor ve OS X'te NSColor ile çalışan bir işlevi nasıl yönetebilirim?

iOS için bir proje oluşturursam, Foundation.h'a baktığımda, üstbilgi listesinde NSColor.h'u bulamıyorum.

İki sistem arasında ayrım yapmak için TARGET_OS_MAC ve TARGET_OS_IPHONE tanımlarını kullanmayı düşündüm ... Doğru yoldayım? Bir iOSTestApp ve OSxTestApp: Ben 2 hedef var Şu anda

:

DÜZENLEME daha fazla bilgi eklemek. Bu hedefler için, sisteme bağlı olarak gerekli çerçeveleri dahil ettim.

TARGET_OS_MAC ve TARGET_OS_IPHONE öğelerini kullanmak, yalnızca OSXTestApp etkin hedef olarak seçtiğimde çalışır. Ben iOSAppTest seçtiğinizde, Xcode OS X veri türü için hatalarını (yani NSColor) İşte

bu hataları üreten koduna örnek verir:

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

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

#endif 

bunun işe yaradığını tanımlar tersine eğer iken .. . Burada bu hataları üreten koduna örnek:

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

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

#endif 
+0

, IOS için bir statik kitaplığa ihtiyacınız olduğunu yanıtladı - sorunun geri kalanı, –

+0

elde edemiyorum Aşağı oyu anlayamıyorum. Her neyse, dinamik bir kütüphane oluşturmak istemiyorum ... Size bir Yardımcı Sınıf oluşturmak istediğimi söylemiş olsaydım, çoklu platform çok daha iyi geliyor mu? – MatterGoal

+0

çünkü soru bana çok net değil ve yorumunuz yardımcı değil: D "Dinamik bir kütüphane istemiyorum" dediğinizde "statik olmayan bir kütüphane oluşturmak": D –

cevap

20

Eğer TARGET_OS_IPHONETARGET_OS_MAC bir varyantı olarak tanımlanır gerçeğinden kaynaklanan görüyoruz sorunları. (Başka bir deyişle, TARGET_OS_IPHONE, TARGET_OS_MAC daha özel bir durumdur. TARGET_OS_IPHONE ise TARGET_OS_IPHONE şeklindedir). Bu nedenle, iOS için derleme sırasında aşağıdaki kod hataları çıkıyor çünkü iOS bu koşulların her ikisiyle de eşleşiyor, ancak iOS için NSColor tanımlı değil.

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

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

#endif 

Aşağıdaki kod çünkü iOS için, ilk harf ile eşleşen her ikisi için düzgün çalıştığından ve Mac OS X için, ilk maç ama ikinci maç yapar etmez.başlık dosyalarında,

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

Ardından ve sadece etrafında örneklerini geçen, sadece örneğin kullanabilirsiniz: o UIColor/NSColor gelince

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

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

#endif 
4

iki Eğer 1 veya 0 için derlemek şeye bağlı olarak ayarlanır hakkında konuşmak tanımlar! böylece

(derleme zamanında) Burada doğru yolda I

örn tahmin

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

, böyle hallederim ImageClassName *.

UIColor/NSColor API'lerini kullanmanız gerektiğinde, kodunuzdaki #if bloğunu tekrarlayın.

+0

vay, bu fikir harika! Teşekkürler, pastırmamı kurtardım. – SpaceDog

İlgili konular