2015-09-21 17 views
43

Po uaktualnieniu do Xcode 7.0 dostaję ostrzeżenie w metodzie UIViewControllerRotation: - (NSUInteger)supportedInterfaceOrientations:Sprzeczne typ zwracany w realizacji „supportedInterfaceOrientations”: - Ostrzeżenie

sprzecznych typ zwracany w realizacji „supportedInterfaceOrientations”: „UIInterfaceOrientationMask "(aka 'enum UIInterfaceOrientationMask') vs 'NSUInteger' (aka 'unsigned int ')

Dlaczego tak jest i jak to naprawić?

EDIT: Jeśli pójdziesz do definicji zobaczysz, że zwracany typ acctually zmieniła: - (UIInterfaceOrientationMask)supportedInterfaceOrientations NS_AVAILABLE_IOS(6_0); ale zmieniając typ zwracany w kodzie nie wyciszyć ostrzeżenia.

+1

NIGDY uciszyć ostrzeżenie (chyba, że ​​jesteś ekspertem, który odpowiedział na siebie, dlaczego jest to dobry pomysł). Napraw kod. – gnasher729

+0

@ gnasher729 OP oczywiście oznacza "quell" lub "zaspokoić" ostrzeżenie, a nie uciszyć go. –

Odpowiedz

105

Spróbuj uszczypnąć:

#if __IPHONE_OS_VERSION_MAX_ALLOWED < 90000 
- (NSUInteger)supportedInterfaceOrientations 
#else 
- (UIInterfaceOrientationMask)supportedInterfaceOrientations 
#endif 
{ 
    return UIInterfaceOrientationMaskPortrait; 
} 
+32

Wykonuj to tylko wtedy, gdy baza kodu musi zostać skompilowana przy użyciu zarówno Xcode 6, jak i 7. Jeśli w pełni przełączasz się na Xcode 7, po prostu użyj '- (UIInterfaceOrientationMask) supportedInterfaceOrientations'. – rmaddy

+0

@rmaddy jest związane z wersją XCODE lub wersją IOS? – nurxyz

+1

@nurne Zarówno naprawdę. Wersja systemu iOS określa dostępność interfejsu API, ale wersja Xcode definiuje podstawowy pakiet SDK. – rmaddy

8

Używam tego jednego:

#if __IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_9_0 
#define supportedInterfaceOrientationsReturnType NSUInteger 
#else 
#define supportedInterfaceOrientationsReturnType UIInterfaceOrientationMask 
#endif 

- (supportedInterfaceOrientationsReturnType)supportedInterfaceOrientations { 
    return UIInterfaceOrientationMaskPortrait; 
} 

... trochę dłużej niż poprawki Nishant, ale trochę jaśniejszy, myślę.

+0

'__IPHONE_9_0' nie jest zdefiniowany w X-kodach przed iOS-9 (technicznie, instaluje się SDK na iOS w' Developers/Platforms/iPhoneOS.platform/Developer/SDKs'), więc nie skompiluje się, chyba że używasz Xcode 7 . @ Rozwiązanie Nishanta polegające na użyciu int literału jest rozwiązaniem tego problemu. Jeśli nie to, możesz sprawdzić '__IPHONE_OS_VERSION_MAX_ALLOWED> __IPHONE_8_4', ale jest to o wiele bardziej kruche i nadal wymaga instalacji iOS 8.4 SDK (Xcode 6.4; nie będzie działać w Xcode 6.3.2). –

+0

@ SlippD.Thompson OK. Dziękuję za wyjaśnienie. – turingtested

+0

Mimo to możesz nadal wykonywać tę pracę, ale musisz samodzielnie zdefiniować '__IPHONE_9_0'. TO ZNACZY. W swoim PCH wykonaj: '#ifndef __IPHONE_9_0' _ [newline] _' #define __IPHONE_9_0 90000' _ [newline] _ 'endif' –

-1

Byłem w tym przez kilka weekendów, aby znaleźć odpowiednie rozwiązanie, próbowałem wielu innych rozwiązań, ale po prostu nie działało prawidłowo. Jeśli chcesz, aby tylko niektóre interfejsy były w orientacji poziomej lub pionowej, wypróbuj tę metodę poniżej. Korzystam z Xcode 7.2.1, używam Bool, aby ustawić wartość wraz z NSUSerDefaults w każdej klasie, którą chcę przestrzegać określonych UInterfaceOrientations. Poniższa metoda jest wywoływana za każdym razem, gdy pojawia się nowy interfejs użytkownika lub gdy urządzenie jest obracane, możesz to sprawdzić, umieszczając NSLog sprawdzający wartość bool w tej metodzie i przekonaj się, jak to się zmienia.

- (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow: 

W AppDelegate wykonać następujące czynności

.h @property (cesji, nonatomic) BOOL shouldRotate;

.m

- (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(nullable UIWindow *)window NS_AVAILABLE_IOS(6_0) __TVOS_PROHIBITED{ 


_shouldRotate = [[NSUserDefaults standardUserDefaults]boolForKey:@"rotateKey"]; 
NSLog(@"Did I get to InterfaceOrientation \n And the Bool is %d",_shouldRotate); 

if (self.shouldRotate == YES) 
      return UIInterfaceOrientationMaskAllButUpsideDown; 
     else 
      return UIInterfaceOrientationMaskPortrait; 

}

TERAZ w każdej klasie CHCESZ posiadania konkretnych UIINTERFACEORIENTATION to zrobić

-(void)viewDidAppear:(BOOL)animated{ 

    [super viewDidAppear:YES]; 

    // [[AppDelegate sharedAppDel]setShouldRotate:YES]; 
    BOOL rotate = NO; 
    [[NSUserDefaults standardUserDefaults]setBool:rotate forKey:@"rotateKey"]; 
    [[NSUserDefaults standardUserDefaults]synchronize]; 

} 
-(BOOL)shouldAutorotate 
{ 
    return YES; 
} 

w widoki, które chcesz obrócić zmienić wartość Bool do Tak. Teraz w AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    // Override point for customization after application launch. 

    BOOL rotate = NO; 
    [[NSUserDefaults standardUserDefaults]setBool:rotate forKey:@"rotateKey"]; 
    [[NSUserDefaults standardUserDefaults]synchronize]; 


    return YES; 
} 

Również w AppDelegate

- (void)applicationWillTerminate:(UIApplication *)application { 
    // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 

    BOOL rotate = NO; 
    [[NSUserDefaults standardUserDefaults]setBool:rotate forKey:@"rotateKey"]; 
    [[NSUserDefaults standardUserDefaults]synchronize]; 
} 

Nadzieja to pomaga wielu deweloperów. Testowane i testowane wiele razy.

Pozdrowienia

JZ

+0

Odpowiedź ur jest nieco myląca. Cały mój projekt jest w trybie portretu i chcę, aby tylko pojedynczy widok w kontrolce paska kart był automatycznym obrotem. jak to można zrobić. – ChenSmile

Powiązane problemy