2010-08-21 19 views
7

Tamam, bir hata hakkında consfused ediyorum:NSRect ve CGRect nasıl uyumsuz türler?

operationLabel = [[NSTextField alloc] initWithFrame:CGRectMake(0, self.frame.size.height/2 - (40 * 3), self.frame.size.width, 100)]; 

tanımı şöyledir::

error: incompatible type for argument 1 of 'initWithFrame:'

Bu neyin sebep olduğunu

- (id)initWithFrame:(NSRect)frameRect; 

Yani ilk argümanı NSRect, kontrol edelim:

typedef CGRect NSRect; 

Hata nasıl ortaya çıkabilir? Farklı isimlerle aynı tipler!

cevap

9

NSRectCGRect aynı türde değil, 64 bit Mac mimarisi veya makro NS_BUILD_32_LIKE_64 ile 32 bit Mac mimarisi, komut satırında veya önek başlığında 1 olarak tanımlanır.

Veya NSGeometry.h alıntı:

#if __LP64__ || TARGET_OS_EMBEDDED || TARGET_OS_IPHONE || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64 
3

NSRect typedef tanımını nereden buldunuz? aşağıdaki gibi Docs göre NSRect tanımlanır: Diğer bir deyişle

typedef struct _NSRect { 
     NSPoint origin; 
     NSSize size; 
} NSRect; 

, sadece CGRect (ama düz typedef) benzeyen bir yapı bu. Zaten conversions between CGRect and NSRect hakkında yazılmış bir şeyler var.

11

zoul cevabı ek olarak ben (10.5 başlayarak) Ben Apple tarafından iki yardımcı işlevlerini (? Makrolar) belirtmekte fayda var: iOS için bina eğer

NSRect NSRectFromCGRect(CGRect cgrect) 
CGRect NSRectToCGRect(NSRect nsrect)