-[UITabBarItem setFinishedSelectedImage:withFinishedUnselectedImage:]: unrecognized selector sent to instance
setFinishedSelectedImage:withFinishedUnselectedImage: 為 **iOS 5.0** 新增 API,iOS 4.3 不存在,調用導致 unrecognized selector 崩潰。
float systemVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
if (systemVersion < 5.0) {
// iOS 4.x 及以下:使用舊版初始化器
self.tabBarItem = [[UITabBarItem alloc] initWithTitle:@"標題"
image:[UIImage imageNamed:@"home-normal"]
tag:0];
} else {
// iOS 5.0+:使用新 API 設置高亮/普通狀態圖片
self.tabBarItem = [[UITabBarItem alloc] init];
self.tabBarItem.title = @"標題";
[self.tabBarItem setFinishedSelectedImage:[UIImage imageNamed:@"home-active"]
withFinishedUnselectedImage:[UIImage imageNamed:@"home-normal"]];
}
iOS 7 後建議使用 setTitleTextAttributes、imageInsets 及 selectedImage(自動渲染模式):
// 圖片設置為渲染模式,系統自動處理選中/未選中顏色
UIImage *normal = [[UIImage imageNamed:@"home-normal"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
UIImage *selected = [[UIImage imageNamed:@"home-active"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
self.tabBarItem = [[UITabBarItem alloc] initWithTitle:@"標題" image:normal tag:0];
self.tabBarItem.selectedImage = selected;
// 可選:調整圖片位置
self.tabBarItem.imageInsets = UIEdgeInsetsMake(6, 0, -6, 0);
NSFoundationVersionNumber 比較而非字串轉 float,避免 "10.0" < "9.3" 邏輯錯誤:
if (NSFoundationVersionNumber <= NSFoundationVersionNumber_iOS_7_1) {
// iOS 7.1 及以下
} else {
// iOS 8+
}
或使用 @available(iOS 5.0, *) 標註(Swift) / if (@available(iOS 5.0, *))(Objective-C 現代語法)。
iOS 4.3 早已淘汰(佔有率 < 0.1%),新項目**無需適配**。維護舊項目時,用版本判斷分支調用對應 API;現代開發統一用 selectedImage + 渲染模式,簡潔且跨版本兼容。