首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

iOS UITabBarItem 圖片設置在 iOS 4.3 崩潰的版本適配方案

     編輯:程式設計綜合問答

崩潰日誌分析


-[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+ / 當前主流)

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 + 渲染模式,簡潔且跨版本兼容。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved