2016-03-23 13 views
5

Diğer geliştiriciler tarafından kullanılacak nesnel bir c çerçevesi geliştiriyorum.İsteğe bağlı bağımlılıkların argümanları c nesnesel c çerçevesi işlevinde params olarak nasıl geçilir

Bu çerçevede, eğer mevcutsa, diğer çerçevelerden mevcut sınıflar kullanılabilirse kullanmak istiyorum.

Örneğin, (varsa - uygulama geliştiricisi tarafından bağlantılı) Ben AdSupport.framework kullanıyorum şu anda aşağıdaki yaklaşımla: şimdi Ancak

if (NSClassFromString(@"ASIdentifierManager")) { 
     NSString adString = [[[NSClassFromString(@"ASIdentifierManager") sharedManager] advertisingIdentifier] UUIDString]; 
} 

, ben kamu işlevlerinin argümanlar sahip olmak istiyorum Benim çerçevem ​​isteğe bağlı bağımlılık sınıflarını içerecek ve bunu yapamıyorum. Örneğin

:

Ben bir işlevi olmasını istiyorsanız:

+ (void) sendLocation: (CLLocation *) myLoc; 

ama CoreLocation.framework isteğe bağlı ve bir uygulamaya belki kullanılamaz edilecektir. Yukarıdaki AdSupport.framework ile benzer bir yaklaşımı nasıl takip edebilirim?

Ben böyle bir şey yapabileceğini kabul:

+ (void) sendLocation: (NSClassFromString(@"CLLocation") *) myLoc; 

veya

+ (void) sendLocation: (id) myLoc; 

veya

+ (void) sendLocation: (Class) myLoc; 

ve sonra bir şekilde ayıklamak koordinatları fakat bunun elde edilmesi mümkün değildi. Son seçenek (Sınıf) derlemek gibi görünüyor ama params ayıklamak için bir yol bulamıyorum ..

Bu konuda yardımcı olabilir misiniz?

MapKit ile

cevap

0

Kısa örnek

Başlığı (Siz istekte uygulamanıza bağlı edilmeyecektir) :

@class MKMapView; 
@interface MyTestInterface : NSObject 
+ (void)printMapViewDescription:(MKMapView *)mapView; 
@end 

Uygulama Dosyası:

#import "MyTestInterface.h" 
#import <MapKit/MapKit.h> 

@implementation 

+ (void)printMapViewDescription:(MKMapView *)mapView { 
    if ((NSClassFromString(@"MKMapView")) { 
     NSLog(@"%@", mapView); 
    } else { 
     NSLog(@"MapKit not available"); 
    } 
} 

@end 

Yani başlıklarına bağlantısı iç. Bu, yalnızca ikili dosyalar sağlıyorsanız veya yalnızca elma çerçevelerini kullanıyorsanız işe yarar. Kaynak kodu sağlarsanız ve üçüncü taraf çerçevelerle etkileşimde bulunmak istiyorsanız, performSelector, NSInvocation veya anonim nesneler (id) üzerindeki objc-runtime ile çalışmanız gerekir.

DÜZENLEME:

@class MKMapView; 
@interface MyTestInterface : NSObject 
+ (void)printMapViewFrame:(MKMapView *)mapView; 
@end 

Uygulama Dosya:

#import "MyTestInterface.h" 

@implementation 

+ (void) printMapViewFrame:(id)mapView { 
    if ([mapView respondsToSelector:@selector(frame)]) { 
     NSMethodSignature *sig = [mapView methodSignatureForSelector:@selector(frame)]; 
     if (sig) { 
      NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:sig]; 
      [invocation setTarget: mapView]; 
      [invocation setSelector:@selector(frame)]; 
      [invocation invoke]; 
      CGRect rect; 
      [invocation getReturnValue:&rect]; 
      NSLog(@"%@", NSStringFromCGRect(rect)); 
     } 
    } 
} 

@end 
NSInvocation

Alınlıklı

Örnek

İlgili konular