为什么[[UINavigationBar外观] setTranslucent:NO]崩溃我的应用程序?

时间:2013-10-01 20:39:49

标签: uinavigationbar ios7

this相同的问题,但该问题被避开(因为当时的NDA)并且不再有效。

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

我在初始视图控制器的viewDidLoad中进行设置。 setTranslucent出现自动完成功能,并且在崩溃和讨论混音和事物之前不会抱怨。

任何关于此的信息都会很棒,我仍然非常难以在我的应用中获得一致的状态栏外观。

5 个答案:

答案 0 :(得分:54)

似乎无法使用translucent设置UIAppearance属性。我不确切知道为什么,但我猜有些属性不受支持。但是,我通过创建自定义UIViewController并使我的应用程序中的所有其他viewControllers成为该自定义viewController的子类来解决此问题。这样,我可以设置全局属性(例如您的translucent),这些属性将由我的应用程序中的所有其他viewControllers继承。我知道这是一个很大的变化,但我希望它有所帮助。

**** 编辑 ****

从iOS 8开始,可以使用UIAppearance设置半透明度:

目标C

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

    [[UINavigationBar appearance] setTranslucent:YES];
}

夫特

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

    UINavigationBar.appearance().translucent = true
}

答案 1 :(得分:8)

你可以通过指定一个不存在的图像来欺骗它,这会使工具栏变得不透明

[[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 :(得分:2)

我不知道你的问题的答案,我从谷歌来到这里,但如果你使用导航控制器,我可以用这一行改变所有的半透明度:

[self.navController.navigationBar setTranslucent:NO];

答案 3 :(得分:2)

因为使用非法方法而崩溃。 在UIAppearance,它说

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

这意味着当您使用[[XXX appearance] method]时,方法方法必须具有属性UI_APPEARANCE_SELECTOR,否则它可能会抛出异常,translucent没有它。

但让我感到困惑的是,在iOS8中[[XXX appearance] method]它还可以,但在iOS7和苹果文档中崩溃并没有说出来。

答案 4 :(得分:0)

初始化类后,您无法更改半透明属性。

[newsViewNavigationController.navigationBar setTranslucent:NO];

我做了类似的事情并且有效!