2010-08-21 13 views
7

Ok, sto consfused su un errore:Come mai NSRect e CGRect sono tipi incompatibili?

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

Questo è ciò che lo causa:

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

La definizione è:

- (id)initWithFrame:(NSRect)frameRect; 

Così il primo argomento è NSRect, controlla:

typedef CGRect NSRect; 

Come può causare un errore? Sono gli stessi tipi chiamati diversamente!

risposta

9

NSRect è dello stesso tipo di CGRect se costruire per iOS, per un'architettura Mac a 64 bit o un'architettura Mac a 32 bit con la macro NS_BUILD_32_LIKE_64 definita come 1 nella riga di comando o in un'intestazione di prefisso.

O, per citare NSGeometry.h:

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

Dove hai ottenuto la definizione typedef di NSRect? Secondo la documentazione NSRect è definito come segue:

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

In altre parole, è una struttura che sembra proprio come CGRect (ma non una pianura typedef). C'è già qualcosa di scritto su conversions between CGRect and NSRect.

11

Oltre alla risposta di Zoul ho pensato di citare le due funzioni di supporto (macro?) Da parte di Apple (che inizia con 10.5):

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