2010-08-21 11 views
7

ठीक है, मैं एक त्रुटि के बारे में consfused हूँ:NSRect और CGRect कैसे असंगत प्रकार आते हैं?

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

परिभाषा है::

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

यह क्या कारण है

- (id)initWithFrame:(NSRect)frameRect; 

तो पहला तर्क है NSRect, आइए इसे जांचें:

typedef CGRect NSRect; 

यह एक त्रुटि का कारण कैसे हो सकता है? वे अलग-अलग नामों के समान हैं!

उत्तर

9

NSRectCGRect रूप में एक ही प्रकार है, 64-बिट मैक आर्किटेक्चर के लिए, या मैक्रो NS_BUILD_32_LIKE_64 के साथ 32-बिट मैक आर्किटेक्चर को कमांड लाइन पर या उपसर्ग शीर्षलेख में 1 के रूप में परिभाषित किया गया है।

या, NSGeometry.h उद्धृत करने के लिए:

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

आपको NSRect की टाइपपीफ परिभाषा कहां मिली? डॉक्स के अनुसार NSRect इस प्रकार परिभाषित किया गया है:

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

दूसरे शब्दों में, यह एक संरचना है कि बस की तरह CGRect (लेकिन एक सादे typedef) लग रहा है। conversions between CGRect and NSRect के बारे में कुछ पहले ही लिखा गया है।

11

zoul के जवाब के अलावा मैंने सोचा कि मैं दो सहायक कार्य (मैक्रो?) एप्पल द्वारा उल्लेख करें (10.5 के साथ शुरू): यदि iOS के लिए निर्माण

NSRect NSRectFromCGRect(CGRect cgrect) 
CGRect NSRectToCGRect(NSRect nsrect) 
संबंधित मुद्दे