2013-10-01 13 views
37

Gleiche Frage wie this, aber diese Frage wurde gemieden (wegen NDA zu der Zeit) und ist nicht mehr aktiv.Warum stürzt [[UINavigationBar appearance] setTransucent: NO] meine App ab?

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** Illegal property type, c for appearance setter, _installAppearanceSwizzlesForSetter:' 

Ich gründe dies in viewDidLoad meiner ersten View-Controller. setTranslucent kommt auf automatische Vervollständigung, und beschwert sich nicht bis zum Zusammenbruch und reden über Swizzles und Dinge.

Alle Infos dazu wären großartig, ich habe immer noch eine sehr harte Zeit, um eine konsistente Statusleiste in meiner App zu erhalten.

+1

Laufen Sie im iOS 7-Simulator oder einem iOS 7-Gerät? Wenn nicht, wird die 'setTranslucent' -Eigenschaft nicht existieren und somit den Absturz verursachen. – hgwhittle

+0

Es stürzt auf Simulator oder Gerät ab? – user

+0

Sie sagten, es stürzt richtig? Ich verstehe deine Antwort nicht ganz. – hgwhittle

Antwort

53

Es scheint, dass die translucent Eigenschaft einfach nicht mit UIAppearance festgelegt werden kann. Ich weiß nicht genau warum, aber ich denke, einige Eigenschaften werden nicht unterstützt. Ich löste dies jedoch, indem ich eine benutzerdefinierte UIViewController erstellte und alle anderen ViewControllers in meiner App zu einer Unterklasse dieses benutzerdefinierten viewControllers machte. Auf diese Weise kann ich globale Eigenschaften (wie translucent in Ihrem Fall) festlegen, die von allen anderen ViewControllern in meiner App vererbt werden. Ich weiß, das ist eine große Veränderung, aber ich hoffe, es hilft.

**** EDIT ****

Ab iOS 8 kann Transluzenz mit UIAppearance eingestellt werden:

Objective C

if([UIDevice currentDevice].systemVersion.floatValue >= 8.0) { 

    [[UINavigationBar appearance] setTranslucent:YES]; 
} 

Swift

if (UIDevice.currentDevice().systemVersion as NSString).floatValue >= 8.0 { 

    UINavigationBar.appearance().translucent = true 
} 
+3

Ich habe am Ende nur die Transluzenz in jedem View-Controller manuell eingestellt. Schneller, aber nicht so sauber wie das Unterklassifizieren oder Definieren eines Protokolls. – user

+5

iOS 8 unterstützte die Einstellung der Transluzenz über UIAppearance. – Pwner

+1

Während die Erklärung sinnvoll ist, wird die Prüfung "conformsToProtocol" auch für iOS 7 durchgeführt. Es wurde eine Systemversionsprüfung durchgeführt, bevor die transluzente Eigenschaft festgelegt wurde. –

8

Sie können es jedoch täuschen, indem Sie ein nicht vorhandenes IMA angeben ge, die die Werkzeugleiste gehen undurchsichtigen

[[UIToolbar appearance] setBackgroundColor:[UIColor colorWithRed:219.0/255.0 green:67.0/255.0 blue:67.0/255.0 alpha:1.0]]; 

[[UIToolbar appearance] setBackgroundImage:[[UIImage alloc] init] forToolbarPosition:UIBarPositionAny barMetrics:UIBarMetricsDefault]; 
2

Ich weiß, wird amke nicht die Antwort auf Ihre Frage und ich habe hier von Google, aber wenn Sie die Navigation-Controller verwenden, kann ich all die Transluzenz mit dieser Zeile:

[self.navController.navigationBar setTranslucent:NO]; 
0

Sie können die transluzente Eigenschaft nicht ändern, nachdem die Klasse initialisiert wurde.

[newsViewNavigationController.navigationBar setTranslucent:NO]; 

Ich habe so etwas getan und es hat funktioniert!

2

Sie stürzen ab, weil Sie die illegale Methode verwenden. in UIAppearance, heißt es

To participate in the appearance proxy API, tag your appearance property selectors in your header with UI_APPEARANCE_SELECTOR. 

es bedeutet, wenn Sie [[XXX appearance] method] verwenden, muss die Methode Methode das Attribut UI_APPEARANCE_SELECTOR haben, oder es kann eine Ausnahme auslösen, und translucent hat es nicht.

aber was mich verwirrt ist, dass [[XXX appearance] method] in iOS8 ist es in Ordnung, aber Abstürze in iOS7 und Apple-Dokument sagt es nicht.

Verwandte Themen