UIAppearance setTranslucent 错误:非法属性类型,c 为外观设置器,_installAppearanceSwizzleForSetter

Posted

技术标签:

【中文标题】UIAppearance setTranslucent 错误:非法属性类型,c 为外观设置器,_installAppearanceSwizzleForSetter【英文标题】:UIAppearance setTranslucent error: Illegal property type, c for appearance setter, _installAppearanceSwizzleForSetter 【发布时间】:2013-07-05 03:49:48 【问题描述】:

试用了 ios 7:

[[UINavigationBar appearance] setTranslucent:NO];

遇到崩溃和错误:

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

其他电话工作正常:例如。

[[UINavigationBar appearance] setBarStyle: UIBarStyleBlack];

当我在本地设置半透明时,它不会崩溃:

[self.navigationController.navigationBar setTranslucent:NO];

我假设这是特定于 iOS 7 的,但还没有在 iOS 6 中尝试过同样的事情。

【问题讨论】:

版主注意:作为一个社区,我们已经同意允许 NDA meta.stackexchange.com/questions/94465/… 下的主题 【参考方案1】:
[[UINavigationBar appearance] setTranslucent:NO] 

iOS 6 不可用。它仅在 iOS 7 及以后可用。

【讨论】:

在 ios7 上也不可用【参考方案2】:

这是解决它的代码。问题是 UIAppearance 不适用于 BOOL 类型。这不应该成为应用程序拒绝的理由,因为它使用标准(尽管是 hacky)程序。玩得开心。

@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

【讨论】:

【参考方案3】:

我用自己的类别解决了这个问题,这样我仍然可以像正常方式一样使用 UIAppearance。

@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

【讨论】:

【参考方案4】:

不知道 iOS 7 怎么样。但是在 iOS6 中,根据文档,您不能将半透明属性设置为 UINavigationBar 的 UIAppearance 对象。有时它会显示自动完成中的所有可能性以及不受支持的可能性

【讨论】:

以上是关于UIAppearance setTranslucent 错误:非法属性类型,c 为外观设置器,_installAppearanceSwizzleForSetter的主要内容,如果未能解决你的问题,请参考以下文章

QLPreviewController NavigationBar setTranslucent 属性不起作用

iOS 7 UINavigationbar setTranslucent:没有崩溃应用程序[重复]

检查 UIAppearance 的可用性

UIAppearance 的“当不包含在”中

UIPageControl + UIAppearance

禁用视图控制器的 UIAppearance