UIAppearance - 工具栏& SearchBar崩溃

时间:2013-08-31 11:14:11

标签: ios objective-c uiappearance

在通过UIAppearance自定义UIToolbar和UISearchBar方面时,我发现无法识别的选择器被发送到实例错误。

奇怪的是,仅在6.1或更低版本上崩溃,在iOS7上运行正常并且不会崩溃。

这是我正在使用的代码:

[[UIToolbar appearance] setBackgroundImage:[UIImage imageNamed:@"toolbarBackground"] forToolbarPosition:UIBarPositionBottom barMetrics:UIBarMetricsDefaultPrompt];
[[UIToolbar appearance] setTintColor:[UIColor whiteColor]];
[[UISearchBar appearance]setBackgroundImage:[UIImage imageNamed:@"searchBarBackground"]  forBarPosition:UIBarPositionAny barMetrics:UIBarMetricsDefault];
[[UISearchBar appearance] setTintColor:[UIColor whiteColor]];

它应该没问题。但每次我在iOS 6.1模拟器上启动应用程序我都会

-[_UIAppearance setBackgroundImage:forBarPosition:barMetrics:]: unrecognized selector sent to instance 0xaba4550

用于UIToolbar和UISearchBar。我确定它们会导致崩溃,因为如果我对这些行进行评论,则应用程序会正常启动。

这段代码有什么问题?我真的被这个困住了。

修改 我设法通过在需要自定义的类中设置方面来实现它,例如:

[[UISearchBar appearance]setBackgroundImage:[UIImage imageNamed:@"searchBarBackground"]];

但现在,当我点击SearchBar时,它会给我默认方面。

2 个答案:

答案 0 :(得分:1)

  

奇怪的是,仅在6.1或更低版本上崩溃,在iOS7上运行正常并且不会崩溃。

setBackgroundImage:forBarPosition:barMetrics:上的

UISearchBar仅适用于iOS {7.0}及更高版本的the documentation

这就是iOS 6.1上无法识别的选择器异常的原因。

答案 1 :(得分:1)

我设法以这种方式工作:

#define SYSTEM_VERSION_EQUAL_TO(v)                  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedSame)
#define SYSTEM_VERSION_GREATER_THAN(v)              ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedDescending)
#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v)  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)
#define SYSTEM_VERSION_LESS_THAN(v)                 ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)
#define SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO(v)     ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedDescending)


UIImage *toolbarImage = [UIImage imageNamed:@"toolbarBackground"];
[self.navigationController.toolbar setBackgroundImage:toolbarImage forToolbarPosition:UIBarPositionAny barMetrics:UIBarMetricsDefault];

UIImage *searchBarImage = [UIImage imageNamed:@"searchBarBackground"];
if (SYSTEM_VERSION_LESS_THAN(@"7.0"))
     [self.searchDisplayController.searchBar setBackgroundImage:searchBarImage];
 else
     [self.searchDisplayController.searchBar setBackgroundImage:searchBarImage forBarPosition:UIBarPositionAny barMetrics:UIBarMetricsDefault];

在需要定制的类中。