2010-04-05 16 views
32

Apple khuyến nghị sử dụng đoạn mã sau để phát hiện xem chạy trên một chiếc iPad hoặc iPhone/iPod Touch:Làm sao người ta có được UI_USER_INTERFACE_IDIOM() để làm việc với hệ điều hành iPhone SDK <3.2

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { 
    // The device is an iPad running iPhone 3.2 or later. 
    // [for example, load appropriate iPad nib file] 
} 
else { 
    // The device is an iPhone or iPod touch. 
    // [for example, load appropriate iPhone nib file] 
} 

Vấn đề là UI_USER_INTERFACE_IDIOM () và UIUserInterfaceIdiomPad KHÔNG được định nghĩa trong SDK trước 3.2. Điều này dường như hoàn toàn đánh bại mục đích của một chức năng như vậy. Chúng chỉ có thể được biên dịch và chạy trên hệ điều hành iPhone 3.2 (hệ điều hành iPhone 3.2 chỉ có thể chạy trên iPad). Vì vậy, nếu bạn có thể sử dụng UI_USER_INTERFACE_IDIOM(), kết quả sẽ luôn là để chỉ ra một iPad.

Nếu bạn bao gồm mã này và nhắm mục tiêu hệ điều hành 3.1.3 (hệ điều hành iPhone/iPod Touch gần đây nhất) để kiểm tra mã ứng dụng chung trên iPhone, bạn sẽ gặp lỗi trình biên dịch vì các ký hiệu không được xác định trong 3.1 .3 hoặc trước đó, khi biên dịch cho giả lập iPhone 3.1.3.

Nếu đây là phương pháp được khuyến nghị bởi Apple để phát hiện thiết bị thời gian chạy, tôi đang làm gì sai? Có ai đã sử dụng phương pháp này để phát hiện thiết bị không?

Trả lời

24

tôi làm điều này để lấy mã để biên dịch trong cả 3.1.3 và 3.2:

BOOL iPad = NO; 
#ifdef UI_USER_INTERFACE_IDIOM 
iPad = (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad); 
#endif 
if (iPad) { 
// iPad specific code here 
} else { 
// iPhone/iPod specific code here 
} 

Tôi cũng đã viết một bài đăng blog nhanh chóng về nó ở đây: http://www.programbles.com/2010/04/03/compiling-conditional-code-in-universal-iphone-ipad-applications/

14

Đây là những gì tôi sử dụng:

- (BOOL) amIAnIPad { 
    #if (__IPHONE_OS_VERSION_MAX_ALLOWED >= 30200) 
     if ([[UIDevice currentDevice] respondsToSelector: @selector(userInterfaceIdiom)]) 
      return ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad); 
    #endif 
    return NO; 
} 

này có điều kiện biên dịch, vì vậy bạn vẫn có thể xây dựng cho sim 3.0. Sau đó nó kiểm tra xem lớp UIDevice có đáp ứng với bộ chọn hay không. Nếu một trong các lỗi này không thành công thì đó không phải là iPad.

+0

Đó là nếu bạn muốn biên dịch cho 3.0. Bạn nên, như drootang nói, biên dịch cho 3.2 và chạy nó trên một thiết bị 3.0, bởi vì 3.2 là những gì bạn gửi cho AppStore. – conradev

+0

Tôi đồng ý, nhưng không có cách nào để kiểm tra trong Trình mô phỏng iPHONE (như trái ngược với iPad) trong khi xây dựng cho 3.2. Nếu bạn muốn thử nghiệm trên cả hai sim, bạn phải làm loại thủ thuật này. –

5

Tôi tin rằng câu trả lời đơn giản là không cố gắng chạy mã trên trình mô phỏng iPhone 3.1.3 hoặc phiên bản cũ hơn. Luôn biên dịch với 3.2 SDK. Giả lập iPhone 3.2 sẽ giúp bạn có được trình giả lập iPad hoặc biên dịch cho Thiết bị iPhone 3.2 và đưa ứng dụng lên điện thoại để kiểm tra.

Không có cách nào để biên dịch dựa trên 3.2 SDK và sử dụng trình mô phỏng 3.1.3 hoặc phiên bản cũ hơn.

+5

có. Bạn có thể xây dựng cho 3.2 SDK sau đó thay đổi mục tiêu hiện tại sang iPhone 3.1 sau đó thực hiện "Run" hoặc "Debug" không xây dựng lại nó. –

0

Điều này dường như hoàn toàn đánh bại mục đích của một chức năng như vậy. Họ chỉ có thể được biên dịch và chạy trên iPhone OS 3.2 (hệ điều hành iPhone 3.2 chỉ có thể chạy được trên iPad). Vì vậy, nếu bạn có thể sử dụng UI_USER_INTERFACE_IDIOM(), kết quả sẽ luôn là để cho biết iPad.

Điều này hoàn toàn không chính xác. Có thể được biên dịch trên SDK cơ sở 3.2, nhưng có thể là chạy trên bất kỳ hệ điều hành nào, nếu bạn đặt mục tiêu triển khai một cách thích hợp.

0

UI_USER_INTERFACE_IDIOM() và UIUserInterfaceIdiomPad có thể được sử dụng trên iOS3.2 trở lên, phần quan trọng là 'trở lên'. Chắc chắn rồi. iOS3.2 chỉ dành cho iPad, nhưng iOS4.0 và hơn thế nữa chạy trên cả iPhone và iPad, vì vậy việc kiểm tra không phải là vô nghĩa như bạn nghĩ.

7

Nếu đây là khuyến cáo của Apple-by-cách tiếp cận để runtime thiết bị phát hiện, những gì tôi làm sai?Có ai đã sử dụng phương pháp này để phát hiện thiết bị bằng cách không?

Đây là giải pháp cho runtime phát hiện:

#define isIPhone (![[UIDevice currentDevice] respondsToSelector:@selector(userInterfaceIdiom)] || [[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) 

Sau đó bạn có thể dễ dàng kiểm tra nó bất cứ nơi nào trong mã của bạn:

if (isIPhone) { ... } 

Sự khác biệt giữa điều này và sử dụng # nếu/#ifdef là đây là thử nghiệm thời gian chạy, trong khi #if là thử nghiệm thời gian biên dịch.

Tôi nghĩ rằng thử nghiệm thời gian chạy là tốt hơn, bởi vì bạn có thể sử dụng một chính xác cho bất kỳ phiên bản hệ điều hành nào trong trường hợp này. Nếu bạn sử dụng kiểm tra thời gian biên dịch, bạn sẽ cần tạo các tệp thi hành khác nhau cho các phiên bản hệ điều hành khác nhau.

Nếu sự cố của bạn là lỗi biên dịch, bạn chỉ nên biên dịch dựa trên phiên bản SDK cuối cùng (xem thêm How to access weak linked framework in iOS?).

5

Thay vì bất cứ công cụ dựa trên trình biên dịch tôi sử dụng:

- (BOOL)deviceIsAnIPad { 
if ([[UIDevice currentDevice] respondsToSelector:@selector(userInterfaceIdiom)]) 
    //We can test if it's an iPad. Running iOS3.2+ 
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) 
     return YES; //is an iPad 
    else 
     return NO; //is an iPhone 
else 
    return NO; //does not respond to selector, therefore must be < iOS3.2, therefore is an iPhone 
} 
2

Declare sử dụng này

#ifdef UI_USER_INTERFACE_IDIOM 
#define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) 
#else 
#define IS_IPAD false 
#endif 

sau đó sử dụng kiểm tra như sau

#define DetailLabel_PosX (IS_IPAD ? 200 : 160) 

Ngoài ra còn có một số xác định để kiểm tra iphone 5

#define IS_IPHONE5 (([[UIScreen mainScreen] bounds].size.height-568)?NO:YES) 
#define IOS_OLDER_THAN_6 ([[[UIDevice currentDevice] systemVersion] floatValue] < 6.0) 
#define IOS_NEWER_OR_EQUAL_TO_6 ([[[UIDevice currentDevice] systemVersion] floatValue] >= 6.0) 
+0

các chức năng trên không hoạt động – HarshIT

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