2013-08-29 16 views
5

La creazione di "Progetto IOS" in xcode 5 provoca quanto segue all'avvio per il simulatore iPad. L'applicazione funziona per la configurazione di iPhone. Ho impostato l'obiettivo di essere 5 e successivi e rimosso l'autolayout in quanto non compatibile con ios/xcode 5.Errore setPreferredContentSize nell'app ios

Viene visualizzato il seguente errore all'avvio dell'app iPad.

2013-08-29 08:53:57.688 IOS Project[350:c07] -[MasterViewController setPreferredContentSize:]: unrecognized selector sent to instance 0x9e2cc20 
2013-08-29 08:53:57.692 IOS Project[350:c07] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[MasterViewController setPreferredContentSize:]: unrecognized selector sent to instance 0x9e2cc20' 
*** First throw call stack: 
(0x1cd012 0x14c4e7e 0x2584bd 0x1bcbbc 0x1bc94e 0xbe7b 0x624d36 0x85054a 0x8506c3 0x40871e 0x4089a2 0x407876 0x418cb5 0x419beb 0x40b698 0x1f5fdf9 0x1f5fad0 0x142bf5 0x142962 0x173bb6 0x172f44 0x172e1b 0x40717a 0x408ffc 0x6d3d 0x6ca5) 

risposta

3

In iOS7, UIViewController ha una nuova proprietà preferredContentSize. Un progetto realizzato per iOS7 ha il seguente metodo:

- (void)awakeFromNib 
{ 
    self.preferredContentSize = CGSizeMake(320.0, 480.0); 
    [super awakeFromNib]; 
} 

invia quindi un messaggio setPreferredContentSize: al proprio controllore, non importa se la proprietà è implementata o meno. Per risolvere il problema, si potrebbe voler evitare di impostare una proprietà che non esiste:

- (void)awakeFromNib 
{ 
    if ([[[UIDevice currentDevice] systemVersion] compare:@"7" options:NSNumericSearch] != NSOrderedAscending) { 
     self.preferredContentSize = CGSizeMake(320.0, 480.0); 
    } 
    [super awakeFromNib]; 
} 
17

anche se la risposta accettata è corretta per identificare il problema, non vorrei verificare la presenza di una versione specifica del dispositivo e di utilizzare invece qualcosa come

if ([self respondsToSelector:@selector(setPreferredContentSize:)]) ... 
+0

La tua risposta mi ha aiutato molto, Ty. – JJ86

2

Se si vuole mantenere la compatibilità a ritroso in voi app, sempre verificare l'esistenza dei metodi di nuova introduzione nella nuova versione di iOS. Se il metodo non esiste nella versione precedente, non deve essere chiamato. Esiste un metodo respondsToSelector mediante il quale è possibile conoscere l'esistenza di un particolare metodo.
Quindi nel tuo caso, se si desidera verificare la presenza di preferredContentSize, si può fare come in questo modo:

if ([self respondsToSelector:@selector(preferredContentSize)]) { 
    self.preferredContentSize = CGSizeMake(320.0, 600.0); 
}