2013-09-02 26 views
10

Tôi có một đoạn mã chỉ hoạt động trên iOS 6 trở lên.Làm cách nào để có điều kiện chỉ bao gồm mã nếu trên một số phiên bản iOS nhất định?

control.tintColor = [UIColor greenColor]; 

Có sẵn sàng sử dụng chỉ thị trình biên dịch như #ifdef iOS6_or_greater không?

+2

bạn đã nghĩ về câu hỏi của bạn? Biên dịch có điều kiện tạo ra một nhị phân tùy thuộc vào những thứ khác nhau (có lẽ là mục tiêu triển khai) nhưng nhị phân đó sẽ làm điều tương tự bất kể. Bạn cần phải cung cấp kiểm tra thời gian chạy, không phải kiểm tra thời gian biên dịch. – trojanfoe

Trả lời

17

Tốt nhất là bạn nên kiểm tra chức năng thay vì phiên bản iOS.

Ví dụ: bạn có thể sử dụng respondsToSelector để xem một phương thức đã cho có được hỗ trợ hay không.

[someObject respondsToSelector:@selector(someMethod)] 

Không đó, có một chỉ thị tiền xử lý

#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 60000 
- (BOOL)supportedInterfaceOrientations 
{ 
    return UIInterfaceOrientationMaskPortrait; 
} 
#endif 
+1

Đây là câu trả lời đúng. 'tintColor' đã được thêm vào' UIView' trong iOS 7. OP nên sử dụng 'respondsToSelector:' thay vì sử dụng kiểm tra số phiên bản. –

+0

Trong trường hợp bị lỗi, tôi cần chỉ thị trình biên dịch #if vì tôi phải biên dịch ios7 trên macbook với xcode 5 nhưng tất cả công việc hàng ngày cần được biên dịch trên mac pro cũ không hỗ trợ 10.8 và do đó doesnt hỗ trợ xcode 5. Tất cả các công cụ khác của tôi, psd, vv là trên mac pro. Vì vậy, tôi phải lấy mã qua lại giữa hai người. Các chỉ thị trình biên dịch trên làm cho nó dễ dàng và sẽ giúp tôi không quên uncomment ra mã ios7 ở cuối. Cảm ơn bạn đã liệt kê cả hai! +1 – badweasel

+0

Trả lời là "tốt nhất" và @MikeWeller cho biết đó là "câu trả lời đúng". Có lý do gì không? Cá nhân, tôi thích kiểm tra phiên bản vì bạn có thể xóa chúng sau này và tất cả đều giống nhau. –

0

bạn có thể đi này ...........

float currSysVerFloat = [[[UIDevice currentDevice] systemVersion]floatValue]; 
if (currSysVerFloat>=6.0) { 
    isversion6=TRUE; 
    control.tintColor = [UIColor greenColor]; 
    //This is iOS6 or greater 
} else { 
    //do nothing 
    isversion6 = FALSE; 
} 
+2

Đây là một cách khủng khiếp để kiểm tra sự tồn tại của một bộ chọn mới. Bạn hầu như không bao giờ cần phải kiểm tra phiên bản hệ thống. Sử dụng 'respondsToSelector:' để thay thế. –

+0

@MikeWeller Nếu 'điều khiển' xảy ra là' UIButton' có thể không phải là thứ bạn muốn. 'UIButton' có' tintColor' kể từ iOS 5.0, 'UISegmentedControl' ngay cả kể từ 2.0, nhưng các điều khiển khác thì không. Nút màu chỉ có vẻ ngu ngốc, vì vậy kiểm tra phiên bản hệ điều hành * có thể * là điều đúng đắn để làm. –

+0

Chỉ cần một người đứng đầu lên đến bất cứ ai cố gắng sử dụng điều này trong watchOS: UIDevice không tồn tại trong watchOS SDK. –

0

tôi chỉ cung cấp cho bạn cơ bản mã so sánh phiên bản hệ thống

Viết mã sau vào

#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending) 

projectName-Prefix.pch để bạn có thể truy cập ở bất cứ đâu bạn muốn.

Và áp dụng nó như tình trạng như vậy như

if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"6")) 
{ 

} 
else 
{ 

} 
+0

Chỉ cần một người đứng đầu lên đến bất cứ ai cố gắng sử dụng điều này trong watchOS: 'UIDevice' không tồn tại trong watchOS SDK. –

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