2015-09-21 13 views
43

Dopo l'aggiornamento a Xcode 7.0 Ho ricevuto un avviso nel metodo UIViewControllerRotation: - (NSUInteger)supportedInterfaceOrientations:contrastanti tipo di ritorno in attuazione del 'supportedInterfaceOrientations': - Attenzione

contrastanti tipo di ritorno in attuazione della 'supportedInterfaceOrientations': 'UIInterfaceOrientationMask '(aka 'enum UIInterfaceOrientationMask') vs 'NSUInteger'(aka 'unsigned int ')

Perché è che, e come posso risolvere il problema?

EDIT: Se si va alla definizione vedrete che il tipo di ritorno acctually è cambiato: - (UIInterfaceOrientationMask)supportedInterfaceOrientations NS_AVAILABLE_IOS(6_0); ma cambiando il tipo di ritorno nel codice non tacitare l'allarme.

+1

MAI tacere un avviso (a meno che non sei un esperto che si è risposto motivo per cui è una buona idea). Correggi il codice. – gnasher729

+0

@ gnasher729 OP significava ovviamente "quell" o "soddisfa" l'avviso, non tacendo a titolo definitivo. –

risposta

105

Prova questo tweak:

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

Eseguire questa operazione solo se il codice base deve essere compilato utilizzando sia Xcode 6 che 7. Se si sta passando completamente a Xcode 7, utilizzare semplicemente '- (UIInterfaceOrientationMask) supportatoInterfaceOrientations'. – rmaddy

+0

@rmaddy è relativo alla versione XCODE o alla versione IOS? – nurxyz

+1

@nurne Entrambe davvero. La versione iOS determina la disponibilità dell'API, ma la versione Xcode definisce l'SDK di base utilizzato. – rmaddy

8

Sto usando questo:

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

- (supportedInterfaceOrientationsReturnType)supportedInterfaceOrientations { 
    return UIInterfaceOrientationMaskPortrait; 
} 

... un po 'più di difficoltà, ma un po' più chiaro di Nishant, credo.

+0

Il '__IPHONE_9_0' non è definito in pre-iOS-9 Xcodes (tecnicamente, iOS SDK installa sotto' Sviluppatore/Piattaforme/iPhoneOS.platform/Developer/SDKs') quindi questo non verrà compilato a meno che non stiate usando Xcode 7 . @ La soluzione di Nishant per l'utilizzo di un letterale int è la soluzione a questo. In caso contrario, è possibile selezionare "__IPHONE_OS_VERSION_MAX_ALLOWED> __IPHONE_8_4', ma questo è molto più fragile e richiede ancora l'installazione dell'SDK di iOS 8.4 (Xcode 6.4, non funzionerà in Xcode 6.3.2). –

+0

@ SlippD.Thompson Ok. Grazie per il chiarimento. – turingtested

+0

Detto questo, puoi ancora farlo funzionare, ma dovresti definire "__IPHONE_9_0' da solo. OSSIA Nel tuo PCH, fai: '#ifndef __IPHONE_9_0' _ [newline] _' #define __IPHONE_9_0 90000' _ [newline] _ '# endif' –

-1

Sono stato a questo per alcuni fine settimana per capire la soluzione corretta, ho provato molte altre soluzioni ma semplicemente non ha funzionato correttamente. Se vuoi che solo l'interfaccia utente sia in orizzontale o verticale prova questo metodo qui sotto. Sto eseguendo Xcode 7.2.1, sto usando un Bool per impostare il valore insieme a NSUSerDefaults in ogni classe che voglio seguire specifici UIInterfaceOrientations. Il metodo qui sotto viene chiamato ogni volta che viene presentata una nuova UI o quando il dispositivo viene ruotato, è possibile verificarlo inserendo un NSLog verificando il valore del bool in quel metodo e verificando di persona come cambia.

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

In te AppDelegate effettuare le seguenti operazioni

@property .h (assegnare, 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; 

}

ormai in ogni classe che si desidera avere un UIInterfaceOrientation SPECIFICO fare questo

-(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; 
} 

le viste che si desidera ruotare modificare il valore Bool a Sì. Ora nel tuo 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; 
} 

anche nel vostro 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]; 
} 

Spero che questo aiuti molti sviluppatori. Testato e testato molte volte.

saluti

JZ

+0

La tua risposta è un po 'confusa. Tutto il mio progetto è in modalità verticale e voglio solo una vista singola nel controller della barra delle schede per essere la rotazione automatica. come potrebbe essere fatto. – ChenSmile