Bug一掃光(iOS相關(guān)總結(jié))2017-11-02更新

圖片發(fā)自簡(jiǎn)書App

由于本人可能最近記性開始減退了,所以要針對(duì)性的采取點(diǎn)措施了!對(duì)應(yīng)犯過的問題,希望我能最好不再犯,如果還是出現(xiàn)了,希望自己能快速找到問題并解決!

1.針對(duì) iOS 10的相關(guān)問題
2.針對(duì) APP上架失敗相關(guān)問題
3.當(dāng)一個(gè)頁(yè)面出現(xiàn)多個(gè)分區(qū)去請(qǐng)求時(shí),使用不同 model 時(shí)會(huì)出現(xiàn)崩潰現(xiàn)象.
4.UI未及時(shí)刷新數(shù)據(jù)
5.手勢(shì)沖突問題
6.關(guān)于 UITextField 收起鍵盤問題
1> 文本輸入框在 tableViewCell 上
2> 文本輸入框在 導(dǎo)航欄 上
3> 文本輸入框和勾選項(xiàng)在同一頁(yè)面的 tableview 的布局上
7.用戶安全和隱私添加描述的相關(guān)問題
8.按鈕點(diǎn)擊無效的問題
9.[__NSCFNumber length]: 的問題
10.__NSCFNumber isEqualToString:的問題
11.linker command failed with exit code 1 (use -v to see invocation)的相關(guān)問題
12.Xcode 8 模擬器無法調(diào)試
13.tableHeaderView刷新(移除子視圖重新創(chuàng)建賦值)的相關(guān)問題
14.啟動(dòng)頁(yè)在模擬器上顯示OK, 在真機(jī)上卻不顯示
15.UIWebView加載過程中,在頁(yè)面沒有加載完畢前,會(huì)顯示一片空白。
16.金額加載中顯示null, 展現(xiàn)修改為加載中為--加載完成顯示正確金額。
17.針對(duì)iOS11/iPhoneX相關(guān)適配問題
18.導(dǎo)航欄上切換頭像的時(shí)候, 取消渲染(而默認(rèn)選中后渲染的render藍(lán)色)
19.當(dāng)多分區(qū)的情況, 采用不同分區(qū)Cell 標(biāo)識(shí)Id防止滑動(dòng)部分?jǐn)?shù)據(jù)丟失

廢話不多說, 開始列舉, 為了后期持續(xù)添加更新方便,這里倒序排列!

十九.當(dāng)多分區(qū)的情況, 采用不同分區(qū)Cell 標(biāo)識(shí)Id防止滑動(dòng)部分?jǐn)?shù)據(jù)丟失

滑動(dòng)的cell里自定義橫線丟失

解決方案:
采用不同分區(qū)Cell 標(biāo)識(shí)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 = @"測(cè)試1";
        } else if (indexPath.row == 1) {
            
            cell.textLabel.text = @"測(cè)試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;
}

十八.導(dǎo)航欄上切換頭像的時(shí)候, 取消渲染(而默認(rèn)選中后渲染的render藍(lán)色)

申明:這張選中圖片按照原始的樣子顯示出來,取消渲染(而默認(rèn)選中后渲染的render藍(lán)色)

使用imageWithRenderingMode

[[UIImage imageNamed:@"day"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]

十七.針對(duì)iOS11/iPhoneX相關(guān)適配問題

請(qǐng)移步:iOS11/iPhoneX相關(guān)適配問題

更新適配版本時(shí) iPhone X 的啟動(dòng)圖適配加上了, 千萬(wàn)別忘了也要傳 Icon. 否則就會(huì)有上傳版本時(shí)會(huì)有提示警告滴~

十六.金額加載中顯示null, 展現(xiàn)修改為加載中為--加載完成顯示正確金額。

拼接字符串時(shí)候, 金額加載過程中會(huì)顯示null.
解決方案:
為了不讓金額加載中顯示null, 則修改加載中為--, 加載完成后顯示正確金額.

valueLabel.text = self.allSale ? self.allSale : @"--";

格式化金額這塊, 請(qǐng)移步:三位一逗號(hào)¥94,862.57

十五.UIWebView加載過程中,在頁(yè)面沒有加載完畢前,會(huì)顯示一片空白。

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

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

十四. 啟動(dòng)頁(yè)在模擬器上顯示OK, 在真機(jī)上卻不顯示

圖片是 jpg 圖片不是 png 圖片, 重新要 png 圖片時(shí)可能美工給你圖片的時(shí)候,直接把jpg文件改后綴為png給你了,但本質(zhì)上它還是一張jpg圖片,真機(jī)根據(jù)你給的png信息無法解析。

解決方案: 找美工重新要一張真的png圖片,或者自己去處理圖片: 用畫圖軟件打開 jpg 圖片另存為 png 圖片. 刪除 APP 重新運(yùn)行即可.

十三.tableHeaderView刷新(移除子視圖重新創(chuàng)建賦值)的相關(guān)問題

像一些循環(huán)創(chuàng)建的控件特別容易出錯(cuò)!這里舉個(gè)栗子:



當(dāng)UITableView加了一個(gè)tableHeaderView以后,而tableHeaderView上有個(gè)循環(huán)創(chuàng)建的標(biāo)簽組視圖,我們?cè)谡?qǐng)求獲取不同值時(shí)很容易多次創(chuàng)建循環(huán)控件,這樣就很容易涉及到刷新tableHeaderView的問題,但很有可能我們不能刷新其他分區(qū),則不需要整體刷新使用[self.tableView reloadData];那么最簡(jiǎn)單解決方案如下:

解決方案:
重新創(chuàng)建前先要移除當(dāng)前子控件上所有數(shù)據(jù)然后賦值,防止控件重復(fù)創(chuàng)建數(shù)據(jù)重疊情況
不用循環(huán),一行代碼移除所有子視圖

  [self.tagsView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];

十二.Xcode 8 模擬器無法調(diào)試

The request was denied by service delegate (SBMainWorkspace) for reason: Unspecified.
才升級(jí) Xcode8.3不到一個(gè)星期, 上一秒還在開心的寫代碼調(diào)試,下一秒模擬器就無法調(diào)試了,鬼知道我經(jīng)歷了什么!


解決方案:

  1. 點(diǎn)擊模擬器前面的工程 -> New Scheme ->Target選擇第一個(gè)Name默認(rèn)點(diǎn)擊OK重新添加一個(gè)工程到模擬器上。


  2. 點(diǎn)擊模擬器前面的工程 ->Manage Schemes (如果你完成第一步就會(huì)有兩個(gè)工程,將以前的刪除掉)刪除方法是選中不要的工程,點(diǎn)擊左下方的“-”號(hào)移除就可以了。
  3. 選中你新添加的工程run就可以了。如果還是不可以的話,就關(guān)閉模擬器和 Xcode, 重新打開運(yùn)行就可以了。

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

這種問題,通常出現(xiàn)在添加第三方庫(kù)文件或者多人開發(fā)時(shí)。
一般是找不到文件而導(dǎo)致的鏈接錯(cuò)誤。 我們可以從如下幾個(gè)方面著手排查。

1> 如果是多人開發(fā),你同步完成后發(fā)現(xiàn)出現(xiàn)如下的錯(cuò)誤。


解決方案:
錯(cuò)誤中出現(xiàn)了“MyPageLogViewController”這個(gè)類,你可以找到這個(gè)類的.m文件, 查看他的Target Membeship,看是否勾選! 如果沒有勾選上,點(diǎn)擊勾選。然后編譯查看。 如下圖:

2> 如果是新添加的第三方庫(kù),且不是靜態(tài)庫(kù)

解決方法:
先重復(fù)第一步過程,然后找到 Build settings->Linking->Other Linker Flags
將此屬性修改成-all_load 或者 -ObjC ,這個(gè)需要視情況而定。總之可以多試幾次的。

3> 如果添加的是第三方靜態(tài)庫(kù)(.a文件)


原因:
在用到這個(gè)庫(kù)的所有文件中都出現(xiàn)了錯(cuò)誤, 如上 BaiduMobStatAppDelegate 類和 MyPageLogViewController類
這種情況就可能是這個(gè)靜態(tài)庫(kù)路徑混亂導(dǎo)致的鏈接錯(cuò)誤

解決方法:
Build settings->Search Path->Library Search Paths 添加靜態(tài)庫(kù)的相應(yīng)路徑。如下圖

4> 如果上面方法都不行且報(bào)錯(cuò)信息如下圖:

解決方案:
看看是不是有新添加的文件跟之前文件同名,修改后面新添加的文件名.我的就是XHHFormulaDetailController文件同名但是不在一個(gè)文件夾里,所以當(dāng)時(shí)新添加上去時(shí)未提醒,也就是說如果在同一個(gè)文件夾內(nèi),會(huì)提醒是否替換文件時(shí)你就能發(fā)現(xiàn)自己文件同名了,但是不是在同一個(gè)文件夾內(nèi)就會(huì)悲催了.

5> 如果上面的所有方法都不管用。你可以再試試這個(gè)方法:

解決方案:
錯(cuò)誤信息中出現(xiàn)了某個(gè)類的名字,去原文件中看看#import了哪些第三方庫(kù),把這些庫(kù)挨個(gè)注釋排除,找到出錯(cuò)的那個(gè)庫(kù),然后按照官方提供的步驟重新添加一遍。

以上這些就是 linker command failed with exit code相關(guān)的問題了!

十. __NSCFNumber isEqualToString:的問題

原因:
接口返回來的數(shù)據(jù),我們客戶端經(jīng)常不能提前知道接口返回的數(shù)據(jù)類型,大部分的數(shù)字是numer類型,但是有很多時(shí)候接口會(huì)返回NULL,解析的時(shí)候當(dāng)做NSString來解析,但是其實(shí)這個(gè)數(shù)據(jù)是NSNumber類型,在iOS 8之前的版本上是不會(huì)報(bào)錯(cuò)的

解決方案:
可以在用到isEqualToString的地方先判斷這個(gè)數(shù)據(jù)的類型,然后再進(jìn)行你的[ str isEqualToString:...]...操作 .
判斷如下:

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

所以從接口拿數(shù)據(jù)的時(shí)候需要統(tǒng)一用**[NSString stringWithFormat: ] **轉(zhuǎn)化一下也可以.

九. [__NSCFNumber length]: 的問題

原因:
這個(gè)錯(cuò)誤是我們客戶端 里寫model的所需的當(dāng)前字段的數(shù)據(jù)類型為NSNumber類型,而在字典轉(zhuǎn)模型時(shí)寫成了NSString類型

解決方案:
將模型屬性中的所需的當(dāng)前字段改為NSNumber類型,調(diào)用的時(shí)候做一下數(shù)據(jù)轉(zhuǎn)換,設(shè)置屬性類型為NSNumber,調(diào)用時(shí)做下數(shù)據(jù)類型轉(zhuǎn)換,用[NSString stringWithFormat: ]轉(zhuǎn)成NSString即可

八. 按鈕點(diǎn)擊無效的問題

我們可以從如下幾個(gè)方面著手排查:

1> 查找是否添加addSubview

2> 查找frame設(shè)置在點(diǎn)擊范圍區(qū)域

解決方案:
第一步和第二步可同時(shí)用添加背景色的方法去排查.

3> 如果上述都沒解決,則看下層級(jí)是否有imageView

原因:
Button放在了imageView上了, imageView沒有打開交互功能,導(dǎo)致按鈕點(diǎn)擊事件無效!

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

bgImageView.userInteractionEnabled = YES;

七. 用戶安全和隱私添加描述的相關(guān)問題

打了全局?jǐn)帱c(diǎn)也未停在項(xiàng)目代碼中


舉個(gè)??:

1> 在掃描相關(guān) 啟動(dòng)相機(jī) 的問題

原因:
相機(jī)啟動(dòng)沒有開啟訪問權(quán)限,在調(diào)用相機(jī),時(shí),都需要在 info.plist 中進(jìn)行配置添加.

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

2> iOS 10對(duì)用戶安全和隱私的增強(qiáng),在申請(qǐng)那多私有權(quán)限的時(shí)候都需要添加描述

原因:
iOS10 對(duì)于隱私權(quán)限更加嚴(yán)格了.在調(diào)用相機(jī),相冊(cè),定位,藍(lán)牙等等時(shí),都需要在 info.plist 中進(jìn)行配置添加.

解決方案:

    <key>NSAppleMusicUsageDescription</key>
    <string>訪問媒體資料</string>
    <key>NSBluetoothPeripheralUsageDescription</key>
    <string>訪問您的藍(lán)牙</string>
    <key>NSCalendarsUsageDescription</key>
    <string>訪問您的日歷</string>
    <key>NSCameraUsageDescription</key>
    <string>訪問您的相機(jī)</string>
    <key>NSLocationAlwaysUsageDescription</key>
    <string>始終訪問您的位置</string>
    <key>NSLocationUsageDescription</key>
    <string>訪問您的位置</string>
    <key>NSLocationWhenInUseUsageDescription</key>
    <string>試用期間訪問您的位置</string>
    <key>NSMicrophoneUsageDescription</key>
    <string>訪問您的麥克風(fēng)</string>
    <key>NSMotionUsageDescription</key>
    <string>訪問運(yùn)動(dòng)與健康</string>
    <key>NSPhotoLibraryUsageDescription</key>
    <string>訪問您的相機(jī)進(jìn)行拍攝</string>
    <key>NSRemindersUsageDescription</key>
    <string>訪問您的提醒事項(xiàng)</string>

六. 關(guān)于 UITextField 收起鍵盤問題

1> 文本輸入框在 tableViewCell 上

解決方案:
這個(gè)時(shí)候僅僅需要添加輕點(diǎn)手勢(shì)在 View上,如果點(diǎn)擊其他區(qū)域讓視圖退出編輯狀態(tài)就收起鍵盤

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

2> 文本輸入框在 導(dǎo)航欄 上

解決方案:
這個(gè)時(shí)候僅僅需要加載在 View上,如果點(diǎn)擊其他空白區(qū)域讓文本輸入框收起鍵盤

    // 添加鍵盤收起手勢(shì)
    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapClick)];
    [self.view addGestureRecognizer:tap];
// 鍵盤收起手勢(shì)
- (void)tapClick {
    
    [self.searchBar resignFirstResponder]; // 關(guān)閉第一響應(yīng)者
}

3> 文本輸入框和勾選項(xiàng)在同一頁(yè)面的 tableview 的布局上

當(dāng)需要去點(diǎn)擊選中或者取消選中時(shí),上面的添加手勢(shì)方法不再可行,會(huì)有沖突.
解決方案:
可以選擇在點(diǎn)擊當(dāng)前行效果里去添加視圖退出編輯(收起鍵盤)效果.

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

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

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

    // 視圖退出編輯狀態(tài)(收起鍵盤)
    [self.view endEditing:YES];
}

五. 手勢(shì)沖突問題

tableviewcell可以觸發(fā)點(diǎn)擊,同時(shí)tableview的父視圖有點(diǎn)擊識(shí)別,這樣點(diǎn)擊的時(shí)候就會(huì)產(chǎn)生沖突。解決方法在GestureRecgnizer代理方法里面區(qū)分手勢(shì)。

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

解決方案: 控制器遵守協(xié)議 UIGestureRecognizerDelegate,實(shí)現(xiàn)下面的方法

#pragma mark tapGestureRecgnizerdelegate 解決手勢(shì)沖突
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
    //NSLog(@"手勢(shì)觸發(fā)的類=%@",NSStringFromClass([touch.view class]));
    // 若為UITableViewCellContentView(即點(diǎn)擊了tableViewCell),則不截獲Touch事件
    // 點(diǎn)擊tableViewCell不執(zhí)行Touch事件
    if ([touch.view isKindOfClass:[UITableView class]]){
    return NO;
    }
     if ([NSStringFromClass([touch.view class]) isEqualToString:@"UITableViewCellContentView"]) {
        return NO;
    }
    return  YES;
}

四. UI未及時(shí)刷新數(shù)據(jù)

解決方案: 需要在主線程去做相應(yīng)操作發(fā)通知去更新

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

三. 當(dāng)一個(gè)頁(yè)面出現(xiàn)多個(gè)分區(qū)去請(qǐng)求時(shí),使用不同 model 時(shí)會(huì)出現(xiàn)崩潰現(xiàn)象.

報(bào)錯(cuò)如下:[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:

解決方案:
在獲取數(shù)據(jù)請(qǐng)求六里不要整體刷新,不要使用reloadData方法. 僅僅刷新當(dāng)前分區(qū)就好.

// 僅僅刷新一個(gè)section
NSIndexSet *indexSet = [[NSIndexSet alloc]initWithIndex:0];
[self.tableView reloadSections:indexSet withRowAnimation:UITableViewRowAnimationAutomatic];

二. 針對(duì) APP上架失敗相關(guān)問題

請(qǐng)移步: iOS APP上架各種被拒"悲劇"

一. 針對(duì) iOS 10的相關(guān)問題

請(qǐng)移步:兼容iOS 10 整理筆記

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容