2010-08-21 18 views
7

Ok, tôi consfused về một lỗi:Làm thế nào để NSRect và CGRect là các loại không tương thích?

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

Đây là những gì gây ra nó:

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

Định nghĩa là:

- (id)initWithFrame:(NSRect)frameRect; 

Vì vậy, số đầu tiên là NSRect, hãy kiểm tra xem:

typedef CGRect NSRect; 

Làm sao nó có thể gây ra lỗi? Chúng cùng loại với tên khác!

Trả lời

9

NSRect là loại giống như CGRect nếu xây dựng dành cho iOS, cho kiến ​​trúc Mac 64 bit hoặc kiến ​​trúc Mac 32 bit có macro NS_BUILD_32_LIKE_64 được định nghĩa là 1 ở dòng lệnh hoặc trong tiêu đề tiền tố.

Hoặc, để trích dẫn NSGeometry.h:

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

Bạn lấy định nghĩa typedef ở đâu là NSRect? Theo các tài liệu NSRect được định nghĩa như sau:

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

Nói cách khác, nó là một cấu trúc trông giống như CGRect (nhưng không phải là một đồng bằng typedef). Đã có nội dung nào đó được viết về conversions between CGRect and NSRect.

11

Ngoài câu trả lời zoul của tôi nghĩ rằng tôi muốn đề cập đến hai hàm helper (macro?) Bởi Apple (bắt đầu với 10,5):

NSRect NSRectFromCGRect(CGRect cgrect) 
CGRect NSRectToCGRect(NSRect nsrect) 
Các vấn đề liên quan