2010-06-29 37 views
25

Tôi đang viết ứng dụng iPhone dựa trên SDK cơ sở 4.0, nhưng tôi đang nhắm mục tiêu OS 3.1.3 để người dùng OS 3 có thể sử dụng ứng dụng.Tắt cảnh báo cụ thể trong một dòng cụ thể trong Xcode

tôi gọi:

[[UIApplication sharedApplication] setStatusBarHidden:YES animated:YES]; 

mà bị phản đối trong iOS 4.0. Tôi biết điều này và có các biện pháp để gọi phiên bản "withAnimation" mới hơn nếu chúng tôi đang chạy dưới iOS 4.0 trở lên.

Tuy nhiên, tôi nhận được cảnh báo rằng tôi đang gọi SDK không dùng nữa.

Tôi muốn tắt cảnh báo cụ thể này ở địa điểm cụ thể này. Tôi muốn tất cả các cảnh báo khác (bao gồm cảnh báo không được chấp nhận tương tự ở các địa điểm khác)

Điều này có thể thực hiện được trong Xcode không?

Trả lời

71

Đối Clang, công trình này:

#pragma clang diagnostic push 
#pragma clang diagnostic ignored "-Wdeprecated-declarations" 
    // Here I like to leave a comment to my future self to explain why I need this deprecated call 
    NSString *myUDID = [[UIDevice currentDevice] uniqueIdentifier]; 
#pragma clang diagnostic pop 

Bạn có thể sử dụng nó bên trong một phương pháp, cho phép bạn rất cụ thể về dòng gây ra cảnh báo bạn muốn đã bị lờ đi.

+0

điều này làm việc tuyệt vời, nhờ – elsurudo

+7

Điều này thực sự nên được đánh dấu là câu trả lời đúng. Đó là ít hacky và giải quyết vấn đề tại thời gian biên dịch, ngoài việc được một chút sạch hơn. –

+0

+1 để sử dụng chính xác tiếng kêu vang, đây là câu trả lời, NSInvocation là một hack –

19

Bạn có thể sử dụng các pragmas GCC. Điều này sẽ tắt cảnh báo không được chấp nhận cho hàm được đính kèm.

#pragma GCC diagnostic push 
#pragma GCC diagnostic ignored "-Wdeprecated" 
-(void)foo{ 
    // As Georg Fritzsche notes below, the pragmas only work outside of functions 
    [[UIApplication sharedApplication] setStatusBarHidden:YES animated:YES]; 
} 
#pragma GCC diagnostic pop 

Tôi không biết nếu điều này sẽ làm việc với Clang, nhưng nó nên làm việc với GCC.

Về cơ bản, nó lưu trạng thái cảnh báo/lỗi, tắt cảnh báo không được chấp nhận, biên dịch hàm, sau đó khôi phục trạng thái chẩn đoán.

+1

Những pragma không được phép bên trong các hàm, chúng sẽ phải bao quanh một số hàm trợ giúp. –

+0

Cảm ơn. Điều này đã không thực sự làm việc. Có vẻ như từ khóa 'push' và 'pop' không hợp lệ, vì chúng tạo ra cảnh báo của riêng chúng. –

+0

Không có hiệu lực ở đây. – Jonny

8

Bạn có thể sử dụng NSInvocation để có được xung quanh những lời cảnh báo không phụ thuộc vào trình biên dịch sử dụng:

UIApplication *app = [UIApplication sharedApplication]; 
SEL sel = @selector(setStatusBarHidden:animated:); 
NSMethodSignature *sig = [app methodSignatureForSelector:sel]; 
NSInvocation *inv = [NSInvocation invocationWithMethodSignature:sig]; 
BOOL b = YES; 
[inv setTarget:app]; 
[inv setSelector:sel]; 
[inv setArgument:&b atIndex:2]; 
[inv setArgument:&b atIndex:3]; 
[inv invoke]; 

Hoặc theo một cách lỗi chịu xuống:

UIApplication *app = [UIApplication sharedApplication]; 
SEL sel = @selector(setStatusBarHidden:animated:); 
IMP imp = [app methodForSelector:sel]; 
imp(app, sel, YES, YES); 
+1

Chữ '[NSMethodSignature signatureWithObjCTypes:" v @ cc "]' được thay thế bằng '[[UIApplication sharedApplication] methodSignatureForSelector: @selector (setStatusBarHidden)]' để làm cho nó dễ đọc hơn? –

+0

Phải, tất nhiên. –

+0

Làm việc điều trị. Cảm ơn. –

4

bạn có thể thực hiện nó như thế này để vượt qua các cảnh báo cùng một lúc

#pragma GCC diagnostic ignored "-Wdeprecated-declarations" 
(void) methodUsingDeprecatedStuff { //use deprecated stuff } 

hoặc

Chỉ cần dán dòng này trước khi sử dụng chất liệu phản của bạn mỗi lần để tránh cảnh báo

#pragma GCC cảnh báo chẩn đoán "-Wdeprecated khai khống"

này sẽ loại bỏ các cảnh báo.

Hy vọng nó sẽ giúp bạn.

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