2013-07-05 9 views
15

Provando iOS 7 ha fatto:errore UIAppearance setTranslucent: Illegal tipo di proprietà, c per l'aspetto setter, _installAppearanceSwizzleForSetter

[[UINavigationBar appearance] setTranslucent:NO]; 

Got incidente e di errore:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** Illegal property type, c for appearance setter, _installAppearanceSwizzleForSetter:' 
*** First throw call stack: 
(0x16ad9b8 0x142e8b6 0x16ad7ab 0x72163d 0x724c34 0x169daca 0x169d8de 0x6c09 0x228ea9 0x2296e9 0x22ab5e 0x240a6c 0x240fd9 0x22c7d5 0x35a4906 0x35a4411 0x16293e5 0x162911b 0x1653b30 0x165310d 0x1652f3b 0x22a2b1 0x22c4eb 0x6f3d 0x1d0d725) 
libc++abi.dylib: terminating with uncaught exception of type NSException 

Altre chiamate funzionano bene: ad es.

[[UINavigationBar appearance] setBarStyle: UIBarStyleBlack]; 

Quando ho creato la traslucenza a livello locale, non va in crash:

[self.navigationController.navigationBar setTranslucent:NO]; 

Sto assumendo questo è specifico per iOS 7, ma non hanno provato stessa cosa in iOS 6 ancora.

+3

Moderatori notare: Noi, come comunità, abbiamo deciso di consentire temi che sono sotto NDA http://meta.stackexchange.com/questions/94465/should-moderators-enforce-ndas-for-software- venditori – kevmalek

risposta

17
[[UINavigationBar appearance] setTranslucent:NO] 

Non è disponibile iOS 6.It è disponibile solo in iOS 7 in poi.

+12

Non disponibile anche su ios7 – Dejell

0

Non so cosa sia su iOS 7. Ma su iOS6, secondo la documentazione non è possibile impostare la proprietà traslucida sull'oggetto UIAppearance di UINavigationBar. Qualche tempo mostra i tutte le possibilità del completamento automatico con uno supportato anche

1

Ecco il codice per aggirare il problema. Il problema è che UIAppearance non funzionerà con i tipi BOOL. Questo non dovrebbe essere motivo di rifiuto dell'app, in quanto utilizza procedure standard (anche se hacky). Divertiti.

@protocol _UITranslucentThingHack 
@property (nonatomic) BOOL translucent; 
@end 

@interface UIView (_UITranslucentAppearanceProxyHack) 
@property (nonatomic) NSNumber * translucentPropertyAsObject; 
@end 

@implementation UIView (_UITranslucentAppearanceProxyHack) 

-(void)setTranslucentPropertyAsObject:(NSNumber *)translucentPropertyAsObject { 
    if([self respondsToSelector:@selector(setTranslucent:)]) { 
     id<_UITranslucentThingHack> trans = (id)self; 
     trans.translucent = [translucentPropertyAsObject boolValue]; 
    } 
} 

-(NSNumber*)translucentPropertyAsObject { 
    if([self respondsToSelector:@selector(setTranslucent:)]) { 
     id<_UITranslucentThingHack> trans = (id)self; 
     return @(trans.translucent); 
    } 
    return nil; 
} 

@end 
1

L'ho risolto con la mia categoria in modo da poter ancora utilizzare UIA in modo simile al normale.

@interface UINavigationBar (MMTranlucenceUIAppearance) 
@property(nonatomic,assign,getter=isMMTranslucent) NSInteger LYTranslucent NS_AVAILABLE_IOS(3_0) UI_APPEARANCE_SELECTOR; // Default is NO on iOS 6 and earlier. Always YES if barStyle is set to UIBarStyleBlackTranslucent 
@end 


@implementation UINavigationBar (MMTranlucenceUIAppearance) 

// it appears that UIAppearance fails with BOOL 
-(NSInteger)isMMTranslucent 
{ 
    return self.translucent ? 0 : 1; 
} 

-(void)setMMTranslucent:(NSInteger)translucent 
{ 
    self.translucent = (translucent == 0) ? NO : YES; 
} 

@end 
Problemi correlati