2010-01-29 24 views
13

Có một cờ trình biên dịch Xcode cụ thể được thiết lập khi biên dịch cho iPad không?Có một cờ trình biên dịch Xcode cụ thể được thiết lập khi biên dịch cho iPad không?

Tôi muốn có điều kiện biên dịch iPad vs đang iPhone/iPod Touch ví dụ:

#ifdef TARGET_IPAD 
    code for iPad 
#else 
    code for iPhone 
#endif 

Tôi biết có là đã TARGET_OS_IPHONE và TARGET_CPU_ARM trong TargetConditionals.h nhưng bất cứ điều gì một cách dễ dàng và đặc biệt nhắm vào iPad?

-Rei

+0

i có cùng một vấn đề. Bạn có bất kỳ giải pháp nào khác để làm điều tương tự như trong câu hỏi của bạn .. Chính xác giống như tôi muốn làm nhưng hiển thị cho tôi lỗi "Biểu tượng không tìm thấy" giúp tôi làm điều này .. – Ayaz

Trả lời

16

Các đúng API sử dụng để kiểm tra thời gian chạy của iPad so với iPhone/iPad Touch là:

BOOL deviceIsPad = ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad); 

các filer tiêu đề UIDevice cũng bao gồm một vĩ mô thuận lợi, UI_USER_INTERFACE_IDIOM(), mà sẽ rất hữu ích nếu mục tiêu triển khai của bạn là < iPhone 3.2 .

#define UI_USER_INTERFACE_IDIOM() ([[UIDevice currentDevice] respondsToSelector:@selector(userInterfaceIdiom)] ? [[UIDevice currentDevice] userInterfaceIdiom] : UIUserInterfaceIdiomPhone) 

Vì vậy, bạn chỉ có thể nói, tiêu cực:

BOOL deviceIsPad = (UI_USER_INTERFACE_IDIOM() != UIUserInterfaceIdiomPhone); 
2

Thay vì sử dụng cờ biên dịch, bạn nên sử dụng kiểm tra thời gian chạy ví dụ: sử dụng NSClassFromString để xem liệu một lớp có tồn tại hay không vì cùng một ứng dụng có thể được cài đặt trên cả hai thiết bị.

Và do khả năng chạy ứng dụng trong cả hai thiết bị, không có kiểm tra biên dịch được tích hợp sẵn cho dù nó có nhắm mục tiêu iPad hay không.

+1

Kenny là chính xác. Apple khuyên bạn nên kiểm tra thời gian chạy để liên kết API và yếu với các khung công tác mới. Bạn có thể sử dụng Tiện ích mở rộng UIDevice của Erica Sadun (http://github.com/erica/uidevice-extension) để dễ dàng kiểm tra thiết bị nào bạn đang chạy khi chạy . Và như Kenny nói, NSClassFromString, respondsToSelector và kiểm tra tên hàm chống lại NULL là bạn của bạn. – Jasarien

0

Hiện tại tôi không tìm thấy bất kỳ thứ gì cho phép bạn kiểm tra xem bạn có đang sử dụng iPad hay không, nhưng tôi cũng không chắc liệu Apple có đề xuất kiểm tra thời gian chạy hay không. Dưới đây là một đoạn trích từ Apple:

Ngoài bộ điều khiển chế độ xem của bạn, bất kỳ lớp nào được chia sẻ giữa thiết bị iPhone và iPad cần bao gồm macro biên dịch có điều kiện để cô lập mã dành riêng cho thiết bị. Mặc dù bạn cũng có thể sử dụng kiểm tra thời gian chạy để xác định xem các lớp hoặc phương thức cụ thể có sẵn hay không, làm như vậy sẽ chỉ tăng kích thước tệp thực thi của bạn bằng cách thêm đường dẫn mã không được theo dõi trên thiết bị này hoặc thiết bị khác. Cho phép trình biên dịch loại bỏ mã này giúp giữ mã của bạn sạch hơn.

Tuy nhiên, không có nơi nào tôi có thể tìm thêm thông tin cụ thể về macro biên dịch có điều kiện.

+0

Vâng, tôi cũng đọc điều này, vì vậy tôi nghĩ rằng sẽ có một số nơi nào đó nhưng tôi không thể tìm thấy nó. Bây giờ, tôi đang kiểm tra xem trên iPad bằng cách sử dụng kích thước màn hình UIScreen nhưng điều đó không có vẻ rất thanh lịch. Tôi sẽ xem xét phần mở rộng UIDevice đã đề cập ở trên. Cảm ơn tất cả! -Rei – Rei

0

Đối với nhiều mục tiêu chia sẻ cùng một dự án/code, tôi đang làm điều này bằng cách chỉnh sửa cờ C cho mục tiêu iPad của tôi.

Với [myapp] -iPad mục tiêu chọn làm mục tiêu hoạt động, chọn Project -> Chỉnh sửa kích hoạt Target [myapp] -iPad. Tìm kiếm "c flags" và nhấp đúp. Thêm cờ cho "-D TARGET_IPAD". Bây giờ biểu tượng TARGET_IPAD sẽ chỉ được xác định cho mục tiêu iPad của bạn.

Tất nhiên, điều này chỉ hoạt động nếu bạn đang sử dụng các mục tiêu riêng cho iPad và iPhone. Nếu bạn đang chạy cùng một nhị phân trên cả hai, rõ ràng là không có gì trình biên dịch có thể làm cho bạn. (Tuy nhiên, 3.2 SDK tính đến cuối tháng Giêng không còn hỗ trợ phổ ứng dụng nào.)

(Edited, tôi đã nhầm lẫn về các thuật ngữ của các ứng dụng "Universal" vv)

+0

Vì vậy, bạn đang nói rằng các ứng dụng phổ quát huyền bí mà Apple nói đến thậm chí không thể tồn tại? Thật thú vị, nếu chúng ta cần có hai bản dựng riêng biệt, đó là hai phiên bản khác nhau để gửi đến cửa hàng ứng dụng. Apple nói đó không phải là những gì họ muốn. Tôi đang chờ xem điều này diễn ra như thế nào. – Justin

+0

Ghi chú phát hành cho SDK 3.REDACTED nói rằng việc xây dựng Ứng dụng UnivREDACTEDal chưa được hỗ trợ. Tôi cá là nó sẽ đến sớm thôi. – qwzybug

-1

Tôi nghĩ rằng điều này sẽ làm

-(BOOL)isDeviceAniPad 
{ 
#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 30200 
    return ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad); 
#endif 
    return NO; 
} 
+0

chỉ cần sử dụng 'UI_USER_INTERFACE_IDIOM()' – user102008

0

Hoặc -> chỉ để đảm bảo

-(BOOL)isDeviceAniPad 
{ 
#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 30200 
BOOL deviceIsPad = ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad); 
return deviceIsPad; 
#endif 
return NO; 
} 
+0

chỉ cần sử dụng 'UI_USER_INTERFACE_IDIOM()' – user102008

Các vấn đề liên quan