一. 關(guān)于 info.plist 的國際化
info.plist 里面通常會添加【功能權(quán)限使用】相關(guān)的說明施逾,因此 info.plist 也需要國際化身笤。如何操作呢苛坚?
- 新建一個 .strings文件份汗,命名為 InfoPlist.strings(文件名必須是這個芯丧!文件名必須是這個腔彰!文件名必須是這個叫编!);
- 之后選中新建的 InfoPlist.strings 文件,點(diǎn)擊右側(cè) Inspector 面板中的 Localize... ;
- 然后添加要支持的語言霹抛;
- 分別添加功能權(quán)限的 key 對應(yīng)的文字說明 value搓逾,如下
NSCameraUsageDescription = "Take passport/ID card photos to upload";
NSPhotoLibraryUsageDescription = "Select passport/ID picture from photo album";
你也可以給 key 加上雙引號(親測),像下面這樣
"NSCameraUsageDescription" = "Take passport/ID card photos to upload";
"NSPhotoLibraryUsageDescription" = "Select passport/ID picture from photo album";
功能權(quán)限對應(yīng)的 key 可以通過以下方式獲得杯拐,如圖
實踐過程中遇到的問題
- 我們工程有兩個 target霞篡,所以建了兩個 plist 文件世蔗。關(guān)于這兩個 plist 文件,一開始我以為需要分別進(jìn)行國際化朗兵,所以建了兩個不同的 .strings 文件:InfoPlist.strings 和 AbroadInfoPlist.strings污淋。調(diào)試我一直使用的是 AbroadInfoPlist.strings 對應(yīng)的 target,導(dǎo)致怎么調(diào)試余掖、更改都不行寸爆。網(wǎng)上資料難道都錯了?究竟哪里不對了盐欺? 心里是萬x駝奔騰赁豆!后來才發(fā)現(xiàn)名稱必須得是 InfoPlist.strings。不過一下午的時間差不多都過去了冗美!F...ck !
- 選中 info.plist 時右側(cè)面板也有 Localize... 的選項魔种,我也懷疑是不是通過這里進(jìn)行 info.plist 的初始化。后面發(fā)現(xiàn)不行粉洼,info.plist 會分別生成對應(yīng)語言的版本放到不同的 .lproj 文件(en.lproj 和 zh-Hans.lproj)中去节预。而 info.plist 需要在 build settings -> packaging -> info.plist File 中進(jìn)行路徑設(shè)置的。而且只能設(shè)置一個路徑漆改。所以這條路走不通心铃,具有迷惑性,也浪費(fèi)了我不少時間挫剑。
關(guān)于 info.plist 的國際化你也可以參考 http://www.reibang.com/p/eb968d10e656
二. AFNetworking 調(diào)試時報錯:Invalid parameter not satisfying: URLString
具體報錯如下
Terminating app due to uncaught exception 'NSInternalInconsistencyException',
reason: 'Invalid parameter not satisfying: URLString'
起因
在做一個搜索界面去扣,上方有一個搜索欄。用戶輸入之后的值會拼接到 path 的后面樊破,如下
let path = "/api/search/\(inputText)"
后來發(fā)現(xiàn)是輸入的有空格愉棱,導(dǎo)致的這個問題。解決方法哲戚,將輸入框中輸入的 inputText 做如下處理
let tmpKey = inputText.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)
然后再拼接到 path 的后面去請求奔滑,就不會報錯了!
這里有一個同樣的問題:http://www.reibang.com/p/e0da891a05da
三. 禁用 UITextView 的復(fù)制顺少,剪切朋其,選擇,全選等功能
// 繼承UITextView重寫這個方法
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
// 返回NO為禁用脆炎,YES為開啟
// 粘貼
if (action == @selector(paste:)) { return NO; }
// 剪切
if (action == @selector(cut:)) { return NO; }
// 復(fù)制
if (action == @selector(copy:)) { return NO; }
// 選擇
if (action == @selector(select:)) { return NO; }
// 選中全部
if (action == @selector(selectAll:)) { return NO; }
// 刪除
if (action == @selector(delete:)) { return NO; }
// 分享
if (action == @selector(share)) { return NO; }
return [super canPerformAction:action withSender:sender];
}
這里有一個討論:https://www.itranslater.com/qa/details/2325748042663724032
四. NSUserDefaults 支持存儲的數(shù)據(jù)類型
NSUserDefaults適合存儲輕量級的本地數(shù)據(jù)梅猿。支持存儲的數(shù)據(jù)類型有:NSNumber(NSInteger、float秒裕、double)袱蚓、NSString、NSDate几蜻、NSArray喇潘、NSDictionary体斩、BOOL。
五. Xcode 真機(jī)調(diào)試報錯 Please reconnect the device
反復(fù)的重新連接手機(jī)颖低,但就是運(yùn)行報錯絮吵。
具體報錯如下:
Failed to prepare device for development.
If you are certain that Xcode supports development on this device, try disconnecting and reconnecting the device.
解決方案:
重啟手機(jī)!3佬肌源武!
重啟大法就是好,能解決很多疑難雜癥想幻!
六. App Store connect 中填寫聯(lián)系信息報 "此欄無效" 的錯誤
解決方法:
大 11 位電話號碼前加地區(qū)號粱栖,像這樣:+86-136xxxxxxxx
七. 如何取消 UIScrollView 的彈簧效果
scrollView.bounces = NO;
八、swift:Cannot convert value of type 'ArraySlice<UInt8>' to specified type '[UInt8]'
解決方案:Array(arr[2…<arr.count])
九脏毯、CUICatalog: Invalid asset name supplied
調(diào)試面板打印了許多如上所示的信息闹究。
原因:使用[UIImage imageNamed:] 時,圖片不存在或者傳入的圖片名為nil.
十食店、準(zhǔn)確計算 UILabel 文本內(nèi)容的高度
開發(fā)過程中渣淤,在使用 boundingRectWithSize:
方法計算字符串的行高時,發(fā)現(xiàn)由于文本內(nèi)容是英文吉嫩,計算出來的行高比實際顯示的要屑廴稀(中文可能沒有這個問題)。經(jīng)過后來揣摩觀察發(fā)現(xiàn)是由于英文單詞的換行是按照 NSLineBreakByWordWrapping
方式進(jìn)行導(dǎo)致的自娩,按照 NSLineBreakByCharWrapping
就沒有問題用踩。
如下圖所示,藍(lán)框右則的文本由于按單詞換行導(dǎo)致沒有頂格顯示
解決方案:借助 NSMutableParagraphStyle 進(jìn)行計算
示例代碼如下
let str = attributedText.string
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.lineBreakMode = .byWordWrapping
// 加個換行符防止 str 不是分段落的文本內(nèi)容忙迁,如果 str 不是分段落的文本內(nèi)容下面的計算方式就無效
let tmpStr = "\(str)\n"
let tmpRect = tmpStr.boundingRect(with: CGSize(width: screenW - 32.0, height: CGFloat.infinity), options: .usesLineFragmentOrigin, attributes: [.font: font, .paragraphStyle: paragraphStyle], context: nil)
let height: CGFloat = ceil(tmpRect.height) + 1
問題完美解決F瓴省!姊扔! 學(xué)會了嗎惠奸!