2016-03-30 17 views
21

Questa funzione viene a mancare con l'errore di runtime:Debug vista gerarchia in Xcode 7.3 non riesce

-[UIWindow viewForFirstBaselineLayout]: unrecognized selector sent to instance 0x7fb9dae257d0 

Chiunque ha incontrato lo stesso?

UPD:
fallisce su simulatore di iOS 8.1/8.4. 9.3 funziona bene.

UPD2: UIWindow viene creato come:

window = UIWindow(frame: UIScreen.mainScreen().bounds)  
window?.rootViewController = RootViewController.rootVC 
window?.makeKeyAndVisible() 
+0

che tipo di operazione fai con 'UIWindow', comunque? – holex

+0

Nessun accordo. L'interfaccia utente non riesce a funzionare da solo. – orkenstein

+0

Sto affrontando lo stesso problema ora, alla ricerca di soluzioni – Jagie

risposta

21

ho avuto il debugger vista lavorare di nuovo ponendo la seguente correzione nel mio progetto:

#ifdef DEBUG 

#import <UIKit/UIKit.h> 
#import <objc/runtime.h> 

@implementation UIView (FixViewDebugging) 

+ (void)load 
{ 
    Method original = class_getInstanceMethod(self, @selector(viewForBaselineLayout)); 
    class_addMethod(self, @selector(viewForFirstBaselineLayout), method_getImplementation(original), method_getTypeEncoding(original)); 
    class_addMethod(self, @selector(viewForLastBaselineLayout), method_getImplementation(original), method_getTypeEncoding(original)); 
} 

@end 

#endif 

Quando i carichi di progetto, il metodo load eseguirà, causando viewForFirstBaselineLayout e viewForLastBaselineLayout utilizzare l'implementazione viewForBaselineLayout se sono non attualmente implementato, quindi visualizzare il debug fa apparire iOS8 il comportamento che stava cercando.

Per aggiungere questo al proprio progetto, creare un nuovo file Objective-C vuoto nel progetto e incollare il contenuto. È possibile denominarlo come si desidera. Io chiamo il mio "UIView + FixViewDebugging". Se ti trovi in ​​un progetto di Swift puro, non è necessario che crei un'intestazione di bridging. Il file verrà compilato nel progetto e non è necessario farvi riferimento.

Nota questo funziona solo per le build di debug a causa dello #ifdef DEBUG. Puoi rimuoverlo ma potresti accidentalmente compilarlo nei tuoi build di rilascio (anche se non dovrebbe avere effetti collaterali negativi). Se questo metodo non funziona con queste linee, controlla che il tuo target abbia DEBUG=1 in Impostazioni build> Apple LLVM - Preelaborazione> Macro preprocessore> Debug.

+2

Ancora rotto a partire da Xcode 7.3.1 (7D1014), con o senza lo swizzling sopra, anche in 9.3 (13E230) Simulator. – verec

+0

Ha funzionato per me su XCode 7.3.1 – Division

+0

Non ha funzionato per me in XCode 7.3.1, iPhone 6s iOS 9.3.2. –

21

Sembra Xcode 7.3 utilizza viewForFirstBaselineLayout proprietà per disegnare l'interfaccia utente. Ma questa proprietà è contrassegnata come disponibile da iOS 9.0.

metodo

Screenshot of UIView.h

[UIView viewForFirstBaselineLayout] deve essere usato per la versione precedente IOS 9.0. Sembra che i ragazzi di Apple non abbiano preso in considerazione questo caso.

+0

È corretto, una volta passato al simulatore iOS 8, si è verificato l'errore e si è passati a iOS 9, non più errori. – bubuxu

0

Sì. quando fai clic sul pulsante della gerarchia della vista di debug, la pagina non ha nulla e stampa "[UIWindow viewForFirstBaselineLayout]: selettore non riconosciuto inviato all'istanza 0x7fb9dae257d0".

Per risolvere il problema, assicurati di utilizzare il systom iOS non inferiore a iOS 9.0 e utilizzerai comunque quella funzione liberamente.

Problemi correlati