2010-08-21 14 views
7

bien, estoy consfused sobre un error:¿Cómo es que NSRect y CGRect son tipos incompatibles?

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

Esto es lo que lo causa:

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

La definición es:

- (id)initWithFrame:(NSRect)frameRect; 

Así que el primer argumento es NSRect, vamos a comprobarlo:

typedef CGRect NSRect; 

¿Cómo puede causar un error? ¡Son los mismos tipos nombrados de manera diferente!

Respuesta

9

NSRect es del mismo tipo que CGRect si la construcción para iOS, para una arquitectura Mac de 64 bits, o una arquitectura Mac de 32 bits con la macro NS_BUILD_32_LIKE_64 se define como 1 en la línea de comando o en un encabezado de prefijo.

O, en palabras de NSGeometry.h:

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

¿Dónde obtuviste la definición typedef de NSRect? De acuerdo con la documentación NSRect se define de la siguiente manera:

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

En otras palabras, es una estructura que se parece a CGRect (pero no una llanura typedef). Ya hay algo escrito sobre conversions between CGRect and NSRect.

11

Además de la respuesta de Zoul pensé que me gustaría mencionar las dos funciones de ayuda (macros?) Por Apple (comenzando con 10,5):

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