Bug一掃光(iOS相關總結)2017 11 02更新

圖片發自簡書App

因爲本人可能最近記性開始減退了,因此要針對性的採起點措施了!對應犯過的問題,但願我能最好再也不犯,若是仍是出現了,但願本身能快速找到問題並解決!web

1.針對 iOS 10的相關問題 2.針對 APP上架失敗相關問題 3.當一個頁面出現多個分區去請求時,使用不一樣 model 時會出現崩潰現象. 4.UI未及時刷新數據 5.手勢衝突問題 6.關於 UITextField 收起鍵盤問題 1> 文本輸入框在 tableViewCell 上 2> 文本輸入框在 導航欄 上 3> 文本輸入框和勾選項在同一頁面的 tableview 的佈局上 7.用戶安全和隱私添加描述的相關問題 8.按鈕點擊無效的問題 9.[__NSCFNumber length]: 的問題 10.__NSCFNumber isEqualToString:的問題 11.linker command failed with exit code 1 (use -v to see invocation)的相關問題 12.Xcode 8 模擬器沒法調試 13.tableHeaderView刷新(移除子視圖從新建立賦值)的相關問題 14.啓動頁在模擬器上顯示OK, 在真機上卻不顯示 15.UIWebView加載過程當中,在頁面沒有加載完畢前,會顯示一片空白。 16.金額加載中顯示null, 展示修改成加載中爲--加載完成顯示正確金額。 17.針對iOS11/iPhoneX相關適配問題 18.導航欄上切換頭像的時候, 取消渲染(而默認選中後渲染的render藍色) 19.當多分區的狀況, 採用不一樣分區Cell 標識Id防止滑動部分數據丟失安全

廢話很少說, 開始列舉, 爲了後期持續添加更新方便,這裏倒序排列!bash

##十九.當多分區的狀況, 採用不一樣分區Cell 標識Id防止滑動部分數據丟失app

滑動的cell裏自定義橫線丟失async

解決方案: 採用不一樣分區Cell 標識Id佈局

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    
    static NSString *cellId = @"cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId];
    
    if (indexPath.section == 0) {
        
        static NSString *vipCellId = @"vip_cell";
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:vipCellId];
        if (!cell) {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:vipCellId];
            cell.selectionStyle = UITableViewCellSelectionStyleNone; 
            
            // 中間分割線
            UIView *line = [[UIView alloc] init];
            line.backgroundColor = YYPLineColor;
            line.frame = CGRectMake(0, 43, UI_View_Width, 1);
            [cell.contentView addSubview:line];
        }
        
        if (indexPath.row == 0) {
            
            cell.textLabel.text = @"測試1";
        } else if (indexPath.row == 1) {
            
            cell.textLabel.text = @"測試2";
        } 

        return cell;
    } else if (indexPath.section == 1) { 
        
        YYPPetCell *cell = [YYPPetCell cellWithTableView:tableView];
        if (self.petList.count) {
            YYPPetModel *model = self.petList[indexPath.row];
            cell.model = model;
        }
        return cell;
    }
    
    return cell;
}
複製代碼

##十八.導航欄上切換頭像的時候, 取消渲染(而默認選中後渲染的render藍色)post

申明:這張選中圖片按照原始的樣子顯示出來,取消渲染(而默認選中後渲染的render藍色)測試

使用imageWithRenderingModeui

[[UIImage imageNamed:@"day"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]
複製代碼

##十七.針對iOS11/iPhoneX相關適配問題 請移步:iOS11/iPhoneX相關適配問題spa

更新適配版本時 iPhone X 的啓動圖適配加上了, 千萬別忘了也要傳 Icon. 不然就會有上傳版本時會有提示警告滴~

##十六.金額加載中顯示null, 展示修改成加載中爲--加載完成顯示正確金額。

拼接字符串時候, 金額加載過程當中會顯示null. 解決方案: 爲了避免讓金額加載中顯示null, 則修改加載中爲--, 加載完成後顯示正確金額.

valueLabel.text = self.allSale ? self.allSale : @"--";
複製代碼

格式化金額這塊, 請移步:三位一逗號¥94,862.57

##十五.UIWebView加載過程當中,在頁面沒有加載完畢前,會顯示一片空白。

**解決方案:**讓UIWebView背景透明。

web.backgroundColor = [UIColor clearColor];
web.opaque = NO;
[web setBackgroundColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"webbg.png"]]];
複製代碼

##十四. 啓動頁在模擬器上顯示OK, 在真機上卻不顯示

圖片是 jpg 圖片不是 png 圖片, 從新要 png 圖片時可能美工給你圖片的時候,直接把jpg文件改後綴爲png給你了,但本質上它仍是一張jpg圖片,真機根據你給的png信息沒法解析。

解決方案: 找美工從新要一張真的png圖片,或者本身去處理圖片: 用畫圖軟件打開 jpg 圖片另存爲 png 圖片. 刪除 APP 從新運行便可.

##十三.tableHeaderView刷新(移除子視圖從新建立賦值)的相關問題 像一些循環建立的控件特別容易出錯!這裏舉個栗子:

當UITableView加了一個tableHeaderView之後,而tableHeaderView上有個循環建立的標籤組視圖,咱們在請求獲取不一樣值時很容易屢次建立循環控件,這樣就很容易涉及到刷新tableHeaderView的問題,但頗有可能咱們不能刷新其餘分區,則不須要總體刷新使用[self.tableView reloadData];那麼最簡單解決方案以下:

解決方案: 從新建立前先要移除當前子控件上全部數據而後賦值,防止控件重複建立數據重疊狀況 不用循環,一行代碼移除全部子視圖

[self.tagsView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
複製代碼

##十二.Xcode 8 模擬器沒法調試 The request was denied by service delegate (SBMainWorkspace) for reason: Unspecified. 才升級 Xcode8.3不到一個星期, 上一秒還在開心的寫代碼調試,下一秒模擬器就沒法調試了,鬼知道我經歷了什麼!

解決方案:

  1. 點擊模擬器前面的工程 -> New Scheme ->Target選擇第一個Name默認點擊OK從新添加一個工程到模擬器上。
  2. 點擊模擬器前面的工程 ->Manage Schemes (若是你完成第一步就會有兩個工程,將之前的刪除掉)刪除方法是選中不要的工程,點擊左下方的「-」號移除就能夠了。
  3. 選中你新添加的工程run就能夠了。若是仍是不能夠的話,就關閉模擬器和 Xcode, 從新打開運行就能夠了。

##十一. linker command failed with exit code 1 (use -v to see invocation)的相關問題

這種問題,一般出如今添加第三方庫文件或者多人開發時。 通常是找不到文件而致使的連接錯誤。 咱們能夠從以下幾個方面着手排查。

####1> 若是是多人開發,你同步完成後發現出現以下的錯誤。

解決方案: 錯誤中出現了「MyPageLogViewController」這個類,你能夠找到這個類的.m文件, 查看他的Target Membeship,看是否勾選! 若是沒有勾選上,點擊勾選。而後編譯查看。 以下圖:

####2> 若是是新添加的第三方庫,且不是靜態庫 解決方法: 先重複第一步過程,而後找到 Build settings->Linking->Other Linker Flags 將此屬性修改爲-all_load 或者 -ObjC ,這個須要視狀況而定。總之能夠多試幾回的。

####3> 若是添加的是第三方靜態庫(.a文件)

緣由: 在用到這個庫的全部文件中都出現了錯誤, 如上 BaiduMobStatAppDelegate 類和 MyPageLogViewController類 這種狀況就多是這個靜態庫路徑混亂致使的連接錯誤

解決方法: Build settings->Search Path->Library Search Paths 添加靜態庫的相應路徑。以下圖

####4> 若是上面方法都不行且報錯信息以下圖:

解決方案: 看看是否是有新添加的文件跟以前文件同名,修改後面新添加的文件名.個人就是XHHFormulaDetailController文件同名可是不在一個文件夾裏,因此當時新添加上去時未提醒,也就是說若是在同一個文件夾內,會提醒是否替換文件時你就能發現本身文件同名了,可是不是在同一個文件夾內就會悲催了.

####5> 若是上面的全部方法都無論用。你能夠再試試這個方法: 解決方案: 錯誤信息中出現了某個類的名字,去原文件中看看#import了哪些第三方庫,把這些庫挨個註釋排除,找到出錯的那個庫,而後按照官方提供的步驟從新添加一遍。

以上這些就是 linker command failed with exit code相關的問題了!

##十. __NSCFNumber isEqualToString:的問題

緣由: 接口返回來的數據,咱們客戶端常常不能提早知道接口返回的數據類型,大部分的數字是numer類型,可是有不少時候接口會返回NULL,解析的時候當作NSString來解析,可是其實這個數據是NSNumber類型,在iOS 8以前的版本上是不會報錯的

解決方案: 能夠在用到isEqualToString的地方先判斷這個數據的類型,而後再進行你的[ str isEqualToString:...]...操做 . 判斷以下:

NSString *str;
if ( [object isKindOfClass:[NSNumber Class]])
{
    str = [object stringValue];
}
else if ([object isKindOfClass:[NSString Class]])
{
  str = object;
}
複製代碼

因此從接口拿數據的時候須要統一用**[NSString stringWithFormat: ] **轉化一下也能夠.

##九. [__NSCFNumber length]: 的問題 緣由: 這個錯誤是咱們客戶端 裏寫model的所需的當前字段的數據類型爲NSNumber類型,而在字典轉模型時寫成了NSString類型

解決方案: 將模型屬性中的所需的當前字段改成NSNumber類型,調用的時候作一下數據轉換,設置屬性類型爲NSNumber,調用時作下數據類型轉換,用[NSString stringWithFormat: ]轉成NSString便可

##八. 按鈕點擊無效的問題 咱們能夠從以下幾個方面着手排查: ####1> 查找是否添加addSubview ####2> 查找frame設置在點擊範圍區域 解決方案: 第一步和第二步可同時用添加背景色的方法去排查.

####3> 若是上述都沒解決,則看下層級是否有imageView 緣由: Button放在了imageView上了, imageView沒有打開交互功能,致使按鈕點擊事件無效!

解決方案: 打開imageView的交互功能.

bgImageView.userInteractionEnabled = YES;
複製代碼

##七. 用戶安全和隱私添加描述的相關問題 打了全局斷點也未停在項目代碼中

舉個🌰: ####1> 在掃描相關 啓動相機 的問題

緣由: 相機啓動沒有開啓訪問權限,在調用相機,時,都須要在 info.plist 中進行配置添加.

解決方案: 在 info.plist 文件裏添加,Source Code模式下添加.

####2> iOS 10對用戶安全和隱私的加強,在申請那多私有權限的時候都須要添加描述

緣由: iOS10 對於隱私權限更加嚴格了.在調用相機,相冊,定位,藍牙等等時,都須要在 info.plist 中進行配置添加.

解決方案:

<key>NSAppleMusicUsageDescription</key>
	<string>訪問媒體資料</string>
	<key>NSBluetoothPeripheralUsageDescription</key>
	<string>訪問您的藍牙</string>
	<key>NSCalendarsUsageDescription</key>
	<string>訪問您的日曆</string>
	<key>NSCameraUsageDescription</key>
	<string>訪問您的相機</string>
	<key>NSLocationAlwaysUsageDescription</key>
	<string>始終訪問您的位置</string>
	<key>NSLocationUsageDescription</key>
	<string>訪問您的位置</string>
	<key>NSLocationWhenInUseUsageDescription</key>
	<string>試用期間訪問您的位置</string>
	<key>NSMicrophoneUsageDescription</key>
	<string>訪問您的麥克風</string>
	<key>NSMotionUsageDescription</key>
	<string>訪問運動與健康</string>
	<key>NSPhotoLibraryUsageDescription</key>
	<string>訪問您的相機進行拍攝</string>
	<key>NSRemindersUsageDescription</key>
	<string>訪問您的提醒事項</string>
複製代碼

##六. 關於 UITextField 收起鍵盤問題

####1> 文本輸入框在 tableViewCell 上 解決方案: 這個時候僅僅須要添加輕點手勢在 View上,若是點擊其餘區域讓視圖退出編輯狀態就收起鍵盤

// 添加鍵盤收起手勢
    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapClick)];
    [self.view addGestureRecognizer:tap];
複製代碼
// 鍵盤收起手勢
- (void)tapClick {
   
    // 視圖退出編輯狀態(收起鍵盤)
    [self.view endEditing:YES];
}
複製代碼

####2> 文本輸入框在 導航欄 上 解決方案: 這個時候僅僅須要加載在 View上,若是點擊其餘空白區域讓文本輸入框收起鍵盤

// 添加鍵盤收起手勢
    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapClick)];
    [self.view addGestureRecognizer:tap];
複製代碼
// 鍵盤收起手勢
- (void)tapClick {
    
    [self.searchBar resignFirstResponder]; // 關閉第一響應者
}
複製代碼

####3> 文本輸入框和勾選項在同一頁面的 tableview 的佈局上 當須要去點擊選中或者取消選中時,上面的添加手勢方法再也不可行,會有衝突. 解決方案: 能夠選擇在點擊當前行效果裏去添加視圖退出編輯(收起鍵盤)效果.

// 選中當前行
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    XHHPremixModel *model = self.list[indexPath.row];

    // 處理勾選性問題, 選中賦值爲1
    if ([model.unit isEqualToString:@"1"]) {
        // 編輯狀態 點擊選中
        model.selected = !model.selected;
        [self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
    }

    // 視圖退出編輯狀態(收起鍵盤)
    [self.view endEditing:YES];
}
複製代碼

##五. 手勢衝突問題 tableviewcell能夠觸發點擊,同時tableview的父視圖有點擊識別,這樣點擊的時候就會產生衝突。解決方法在GestureRecgnizer代理方法裏面區分手勢。

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapClick)];
 [self.view addGestureRecognizer:tap];
 tap.delegate = self; // 解決手勢衝突問題設置代理
複製代碼

解決方案: 控制器遵照協議 UIGestureRecognizerDelegate,實現下面的方法

#pragma mark tapGestureRecgnizerdelegate 解決手勢衝突
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
    //NSLog(@"手勢觸發的類=%@",NSStringFromClass([touch.view class]));
    // 若爲UITableViewCellContentView(即點擊了tableViewCell),則不截獲Touch事件
    // 點擊tableViewCell不執行Touch事件
    if ([touch.view isKindOfClass:[UITableView class]]){
    return NO;
    }
     if ([NSStringFromClass([touch.view class]) isEqualToString:@"UITableViewCellContentView"]) {
        return NO;
    }
    return  YES;
}
複製代碼

##四. UI未及時刷新數據 解決方案: 須要在主線程去作相應操做發通知去更新

- (void)setUnreadMessageNum:(int)unreadMessageNum {
    
    _unreadMessageNum = unreadMessageNum;
    
   // 須要在主線程去更新 發通知
    dispatch_async(dispatch_get_main_queue(), ^{
        [[NSNotificationCenter defaultCenter] postNotificationName:ZH_Notification_isChangedUnreadMessageNum object:nil];
    });
}
複製代碼

##三. 當一個頁面出現多個分區去請求時,使用不一樣 model 時會出現崩潰現象. 報錯以下:[XHHNewTecProModel materialName]: unrecognized selector sent to instance 0x60000042dce0 2017-03-24 10:39:06.356 ZLFeed[25691:1317187] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[XHHNewTecProModel materialName]: unrecognized selector sent to instance 0x60000042dce0' *** First throw call stack:

解決方案: 在獲取數據請求六裏不要總體刷新,不要使用reloadData方法. 僅僅刷新當前分區就好.

// 僅僅刷新一個section
NSIndexSet *indexSet = [[NSIndexSet alloc]initWithIndex:0];
[self.tableView reloadSections:indexSet withRowAnimation:UITableViewRowAnimationAutomatic];
複製代碼

##二. 針對 APP上架失敗相關問題 請移步: iOS APP上架各類被拒"悲劇"

##一. 針對 iOS 10的相關問題 請移步:兼容iOS 10 整理筆記

相關文章
相關標籤/搜索