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

Robię odpowiedzi na kod selektora (powyżej), aby obsłużyć przestarzałe metody. W ten sposób moja aplikacja jest kompatybilna ze starszymi wersjami iOS, ale dostaję ostrzeżenia w swoim kodzie stwierdzające: "" dismissModalViewControllerAnimated: "jest nieaktualne: najpierw przestarzałe w iOS 6.0" Osobiście nie lubię żadnych ostrzeżeń w moim kodzie, ale co ważniejsze, czytałem gdzieś, że jabłko będzie narzekać na ostrzeżenia w twoim kodzie.przestarzałe ostrzeżenia w kodzie Xcode i sposób postępowania z wycofaniem

1) Czy Apple będzie skarżyło się na ostrzeżenia w swoim kodzie?

2) Czy poprawnie obsługuję przestarzałe metody?

3) Czy istnieje sposób, aby wyłączyć przestarzałe ostrzeżenia dotyczące metody metody?

+2

BTW - Apple nie będzie narzekać na ostrzeżenia w kodzie. Nie mają możliwości dowiedzenia się, że są jakieś (o ile istnieją), chyba że wyślesz im notatkę i powiesz im. – rmaddy

+0

Dobra odpowiedź, ale moje pytanie jest bardziej ogólne pytanie, co zrobić w sytuacji podobnej do tej? Chcę obsłużyć co najmniej jedną lub dwie wersje, więc w tym scenariuszu masz rację, ale co z innymi scenariuszami, w których potrzebujesz obsługiwać oba? jak sobie z tym poradzisz? Tak jak napisałem powyżej i pozostawić ostrzeżenia w? – ConfusedDeer

+2

Nie otrzymasz żadnych ostrzeżeń o wycofaniu, o ile metoda nie została wycofana przed wybranym "celem wdrożenia". Jeśli metoda została uznana za przestarzałą przed "Celem wdrożenia", nie należy podejmować żadnych prób użycia tej nieaktualnej metody. Tak naprawdę nie ma naprawdę wiele do roboty. – rmaddy

Odpowiedz

17
  1. Apple są nieświadomi jakichkolwiek ostrzeżeń czasu kompilacji otrzymywanych z kodem.

  2. Tak, prawidłowo postępujesz z tą praktyką. Oczywiście w tym przypadku musisz tylko wykonać ten wysiłek, jeśli obsługujesz system iOS przed 5.0. Ogólnie jednak technika testowania, czy dana metoda może zostać wywołana, a następnie wywołanie odpowiedniej wersji, jest absolutnie poprawna.

  3. Jeśli chcesz wyłączyć ostrzeżenie, byś po prostu chwilowo wyłączyć ostrzeżenie, a następnie włącz go ponownie później, stosując odpowiednią #pragma składnię:

    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 
    } 
    

    Przy okazji, jeśli chcesz wiedzieć co kod -W jest dla danego ostrzeżenia, przejdź do dziennika Navigator wybierz niedawne build że zawarte ostrzeżenie i poszerzyć dziennik, a zobaczysz go tam:

    enter image description here

Należy również pamiętać, że chociaż można stłumić ostrzeżenie, jak to zilustrowałem powyżej, w praktyce rzadko trzeba to robić. Jeśli użyjemy tego przykładu, jeśli docelowy poziom wdrożenia systemu iOS w projekcie wynosił 4,3, nie pojawi się ostrzeżenie. A jeśli cel wdrożenia wynosił 6,0 lub więcej, otrzymasz to ostrzeżenie, ale prawdopodobnie nie będziesz potrzebować tego warunkowego kodu, aby zadzwonić pod numer dismissModalViewControllerAnimated, ponieważ działający iOS 5.0, zawsze możesz użyć dismissViewControllerAnimated.

Jedynym momentem, w którym trzeba ukryć to ostrzeżenie w kodzie, jest kod źródłowy, który ma zostać uwzględniony w projektach w przyszłości, co do którego nie wiadomo, jaki będzie docelowy poziom wdrożenia. Na przykład, jeśli nie wiesz, czy powyższy kod zostanie zawarty w projekcie o wartości 4.3 docelowe wdrożenie lub cel wdrożenia 5.0+. W takim przypadku ta składnia jest całkiem przydatna. Ale potem znowu, można również użyć kontrole warunkowe na __IPHONE_OS_VERSION_MIN_REQUIRED, np:

#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

Wszelkie przemyślenia na temat sposobów radzenia sobie z poleceniami #pragma dla Swift. Zastanawiam się właśnie nad zdefiniowaniem pewnych stałych w pliku nagłówkowym pomostowym i spróbuję wywołać to w Swift. –

1
  1. Nie
  2. Należy stosować najnowsze metody, chyba że są specjalnie stara się wspierać stare wersje iOS, wtedy należy użyć metodę opisaną powyżej. "Metoda określona jako przestarzała została zastąpiona i może nie być obsługiwana w przyszłości."
  3. Po zmianie docelowej lokalizacji wdrożenia w docelowej aplikacji na 5.0, przestarzałe ostrzeżenia dotyczące systemu iOS 5 nie będą wyświetlane jako błędy.

Jeśli jesteś naprawdę zainteresowany wstecznej kompatybilności, istnieje wielka poradnik przez Ray Wenderlich here

+0

Thanjs do linku samouczka. – ConfusedDeer

0

Tak Wiele ostrzeżenia są obecne i oddalenie widoku modally to naprawić wymienić:

w iOS 6 są to: -

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

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

Powiązane problemy