因爲本人可能最近記性開始減退了,因此要針對性的採起點措施了!對應犯過的問題,但願我能最好再也不犯,若是仍是出現了,但願本身能快速找到問題並解決!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藍色)測試
使用imageWithRenderingMode
ui
[[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刷新(移除子視圖從新建立賦值)的相關問題 像一些循環建立的控件特別容易出錯!這裏舉個栗子:
解決方案: 從新建立前先要移除當前子控件上全部數據而後賦值,防止控件重複建立數據重疊狀況 不用循環,一行代碼移除全部子視圖
[self.tagsView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
複製代碼
##十二.Xcode 8 模擬器沒法調試 The request was denied by service delegate (SBMainWorkspace) for reason: Unspecified. 才升級 Xcode8.3不到一個星期, 上一秒還在開心的寫代碼調試,下一秒模擬器就沒法調試了,鬼知道我經歷了什麼!
解決方案:
##十一. linker command failed with exit code 1 (use -v to see invocation)的相關問題
這種問題,一般出如今添加第三方庫文件或者多人開發時。 通常是找不到文件而致使的連接錯誤。 咱們能夠從以下幾個方面着手排查。
####1> 若是是多人開發,你同步完成後發現出現以下的錯誤。
####2> 若是是新添加的第三方庫,且不是靜態庫 解決方法: 先重複第一步過程,而後找到 Build settings->Linking->Other Linker Flags 將此屬性修改爲-all_load 或者 -ObjC ,這個須要視狀況而定。總之能夠多試幾回的。
####3> 若是添加的是第三方靜態庫(.a文件)
解決方法: 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 整理筆記