2013-09-01 70 views
13
if ([self respondsToSelector:@selector(dismissViewControllerAnimated:completion:)]) 
    {[[self presentingViewController] dismissViewControllerAnimated:YES completion:nil];} //post-iOS6.0 
else {[self dismissModalViewControllerAnimated:YES];} //pre-iOS6.0 

Tôi đang trả lời mã chọn (ở trên) để xử lý các phương pháp không dùng nữa. Bằng cách đó, ứng dụng của tôi tương thích với các phiên bản iOS cũ hơn, nhưng tôi nhận được cảnh báo trong mã của mình cho biết: "'dismissModalViewControllerAnimated:' không được dùng nữa: không được dùng nữa trong iOS 6.0" Cá nhân tôi không thích cảnh báo nào trong mã của mình, nhưng quan trọng hơn, tôi đọc ở đâu đó rằng táo sẽ phàn nàn về cảnh báo trong mã của bạn.cảnh báo không được chấp nhận trong xcode và cách xử lý việc ngừng sử dụng

1) Apple có phàn nàn về cảnh báo trong mã của bạn không?

2) Tôi có đang xử lý chính xác các phương pháp không dùng nữa không?

3) Có cách nào để tắt cảnh báo phương pháp phương pháp không dùng nữa không?

+2

BTW - Apple sẽ không phàn nàn về cảnh báo trong mã của bạn. Họ không có cách nào để biết có bất kỳ (nếu có), trừ khi bạn gửi cho họ một lưu ý và nói với họ. – rmaddy

+0

Câu trả lời hay, nhưng câu hỏi của tôi là một câu hỏi chung về việc phải làm gì trong một tình huống tương tự như vậy? Tôi muốn hỗ trợ ít nhất 1 hoặc hai phiên bản, vì vậy trong trường hợp này bạn là chính xác, nhưng làm thế nào về các kịch bản khác, nơi bạn sẽ cần phải hỗ trợ cả hai? Bạn sẽ xử lý nó như thế nào? Như tôi đã nói ở trên và để lại cảnh báo trong? – ConfusedDeer

+2

Bạn sẽ không nhận được bất kỳ cảnh báo không dùng nữa miễn là phương pháp này không được chấp nhận trước khi bạn chọn "Mục tiêu triển khai" đã chọn. Nếu phương pháp không được chấp nhận trước "Mục tiêu triển khai" của bạn, thì bạn không nên thực hiện bất kỳ nỗ lực nào để sử dụng phương pháp không dùng nữa. Vì vậy, có thực sự ít để đối phó với thực sự. – rmaddy

Trả lời

17
  1. Apple đang không biết về bất kỳ cảnh báo thời gian biên dịch bạn nhận được với mã của bạn.

  2. Có, bạn đang xử lý thực hành này một cách chính xác. Rõ ràng, trong trường hợp này, bạn chỉ cần trải qua nỗ lực này nếu bạn đang hỗ trợ iOS trước 5.0. Tuy nhiên, nói chung, kỹ thuật để kiểm tra xem liệu một phương thức có thể được gọi ra và sau đó gọi sự biểu diễn thích hợp là hoàn toàn chính xác.

  3. Nếu bạn muốn tắt các cảnh báo, bạn sẽ chỉ đơn giản là tạm thời ngăn chặn các cảnh báo và sau đó bật nó trở lại sau đó bằng cách sử dụng thích hợp #pragma cú pháp:

    if ([self respondsToSelector:@selector(dismissViewControllerAnimated:completion:)]) 
    { 
        //post-iOS6.0 
        [self dismissViewControllerAnimated:YES completion:nil]; 
    } 
    else 
    { 
        // pre-iOS6.0 
    #pragma clang diagnostic push 
    #pragma clang diagnostic ignored "-Wdeprecated-declarations" 
        [self dismissModalViewControllerAnimated:YES]; 
    #pragma clang diagnostic pop 
    } 
    

    Bằng cách này, nếu bạn muốn biết những gì mã -W là cảnh báo cụ thể của bạn, hãy đến log Navigator của bạn, chọn xây dựng gần đây trong đó có cảnh báo, và mở rộng các bản ghi, và bạn sẽ thấy nó ở đó:

    enter image description here

Cũng lưu ý rằng mặc dù bạn có thể chặn cảnh báo như tôi đã minh họa ở trên, trên thực tế, bạn hiếm khi cần làm như vậy. Sử dụng ví dụ của bạn, nếu mục tiêu triển khai iOS của dự án của bạn là 4.3, bạn sẽ không nhận được cảnh báo. Và nếu mục tiêu triển khai của bạn là 6.0 hoặc cao hơn, bạn sẽ nhận được cảnh báo đó, nhưng sau đó lại có thể không cần mã có điều kiện này để gọi dismissModalViewControllerAnimated vì iOS 5.0 hiệu quả, bạn luôn có thể sử dụng dismissViewControllerAnimated.

Lần duy nhất bạn cần chặn cảnh báo này trong mã của bạn là nếu bạn có mã nguồn, sẽ được đưa vào các dự án trong tương lai, mà bạn không biết mục tiêu triển khai sẽ là gì. Sử dụng ví dụ của bạn, nếu bạn không biết liệu mã trên có được bao gồm trong dự án có 4 hay không.3 mục tiêu triển khai hoặc mục tiêu triển khai 5.0+. Trong trường hợp đó, cú pháp này khá hữu ích. Nhưng, sau đó một lần nữa, tôi bạn cũng có thể sử dụng kiểm tra điều kiện trên __IPHONE_OS_VERSION_MIN_REQUIRED, ví dụ:

#if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_5_0 
    if ([self respondsToSelector:@selector(dismissViewControllerAnimated:completion:)]) 
    { 
     //post-iOS5.0 
     [self dismissViewControllerAnimated:YES completion:nil]; 
    } 
    else 
    { 
     // pre-iOS5.0 
     [self dismissModalViewControllerAnimated:YES]; 
    } 
#else 
    [self dismissViewControllerAnimated:YES completion:nil]; 
#endif 
+0

Bất kỳ suy nghĩ nào về cách người ta có thể đối phó với lệnh #pragma cho Swift. Tôi đang nghĩ về việc chỉ định một số hằng số trong một tệp tiêu đề bắc cầu và cố gắng gọi nó trong Swift. –

1
  1. Không
  2. Bạn nên sử dụng phương pháp gần đây nhất trừ khi bạn đang đặc biệt cố gắng để hỗ trợ các phiên bản iOS cũ, sau đó bạn nên sử dụng phương pháp mà bạn nêu trên. "Một phương pháp được xác định là không được chấp nhận đã bị thay thế và có thể không được hỗ trợ trong tương lai".
  3. Nếu bạn thay đổi mục tiêu triển khai trong mục tiêu ứng dụng của bạn thành 5.0, cảnh báo không được chấp nhận cho iOS 5 sẽ không hiển thị dưới dạng lỗi.

Nếu bạn đang thực sự quan tâm đến khả năng tương thích ngược, có một hướng dẫn tuyệt vời bởi Ray Wenderlich here

+0

Thanjs cho liên kết hướng dẫn. – ConfusedDeer

0

Có Nhiều cảnh báo là của hiện tại, miễn nhiệm xem modally để khắc phục điều đó Replace:

trong ios 6 này là: -

  1. [self dismissViewControllerAnimated:NO completion:nil];

  2. [self presentViewController:vc animated:NO completion:nil];