2013-10-01 7 views
37

To samo pytanie, co this, ale to pytanie zostało odrzucone (z powodu NDA w tym czasie) i nie jest już aktywne.Dlaczego [[Wygląd UINavigationBar] setTranslucent: NO] awarii mojej aplikacji?

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

Ustawię to w viewDidLoad mojego początkowego kontrolera widoku. setTranslucent pojawia się na autouzupełnianiu i nie narzeka aż do awarii i rozmawiania o swizzlach i innych rzeczach.

Wszelkie informacje na ten temat są świetne, nadal mam bardzo trudny czas, by uzyskać spójny pasek stanu w całej mojej aplikacji.

+1

Czy używasz symulatora systemu iOS 7 lub urządzenia z systemem iOS 7? Jeśli nie, właściwość 'setTranslucent' nie będzie istniała i spowoduje awarię. – hgwhittle

+0

To zawiesza się na symulatorze lub urządzeniu? – user

+0

Powiedziałeś, że to się załamuje, prawda? Nie bardzo rozumiem twoją odpowiedź. – hgwhittle

Odpowiedz

53

Wygląda na to, że nie można ustawić właściwości translucent przy użyciu UIAppearance. Nie wiem dokładnie dlaczego, ale myślę, że niektóre właściwości po prostu nie są obsługiwane. Jednak rozwiązałem ten problem, tworząc niestandardowy UIViewController i czyniąc wszystkie inne kontrolery view w mojej aplikacji podklasą tego niestandardowego kontrolera viewController. W ten sposób mogę ustawić globalne właściwości (takie jak translucent w twoim przypadku), które będą dziedziczone przez wszystkie inne kontrolery viewController w mojej aplikacji. Wiem, że to duża zmiana, ale mam nadzieję, że to pomoże.

**** EDIT ****

jako iOS 8, przezroczystość można ustawić UIAppearance:

Cel 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

Skończyłem właśnie ustawiając przezroczystość w każdym kontroler widoku ręcznie. Szybciej, ale nie tak czysto jak podklasy lub definiując protokół. – user

+5

System iOS 8 rozpoczął obsługę ustawiania przezroczystości za pośrednictwem interfejsu UIAppearance. – Pwner

+1

Chociaż wyjaśnienie ma sens, sprawdzenie conformsToProtocol również przechodzi na iOS 7. Zakończono sprawdzanie wersji systemu przed ustawieniem właściwości półprzezroczystości. –

8

Można go jednak oszukać, podając nieistniejący ima ge, który Amke pasek narzędzi iść nieprzezroczysty

[[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

ja nie znam odpowiedzi na swoje pytanie i mam tutaj z google, ale jeśli używasz kontrolerów nawigacji, mogę zmienić cały przezierność z tej linii:

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

Nie można zmienić półprzezroczystej właściwości po inicjalizacji klasy.

[newsViewNavigationController.navigationBar setTranslucent:NO]; 

Zrobiłem coś takiego i zadziałało!

2

awarię, ponieważ używasz nielegalnej metody. w UIAppearance, mówi

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

to znaczy podczas korzystania [[XXX appearance] method] metoda metoda musi mieć UI_APPEARANCE_SELECTOR atrybutu, lub może to wyjątek, a translucent nie ma.

Ale to, co mnie zastanawia, to, że [[XXX appearance] method] w iOS8 jest ok, ale zawiesza się w iOS7, a dokument Apple nie mówi tego.

Powiązane problemy