本文中的一些坑點是樓主個人在日常開發(fā)中遇到的一些問題,記錄搜集下來分享在此,希望能給同樣遇到問題的同學(xué)一些幫助
后續(xù)不定期持續(xù)更新
保持手機常亮
很多時候,我們需要保持手機常亮,比如視頻或直播的時候,那么只需要加上下面這句就好了,但是離開當前頁面的時候不要忘記關(guān)掉(設(shè)置為NO)
[[UIApplication sharedApplication] setIdleTimerDisabled:YES];
開啟系統(tǒng)自帶側(cè)滑返回
當你修改導(dǎo)航欄以后,你就會發(fā)現(xiàn)自帶側(cè)滑返回(邊緣70寬度有效)不能用了,那么請你在navi
的根視圖控制器里面加上這句,就可以了
// Objective - C
self.navigationController.interactivePopGestureRecognizer.delegate = (id<UIGestureRecognizerDelegate>)self;
// swift因為是強類型,所以不能像上面那么寫
// 你只需要根視圖遵循UIGestureRecognizerDelegate協(xié)議,然后加上下面這句就OK了
navigationController.interactivePopGestureRecognizer.delegate = self
Xcode 8的注釋快捷鍵不能用了
Xcode8
上的bug
真是多到可怕,注釋快捷鍵問題就是其中之一,有時用的好好的,突然就失靈了,這不是你的電腦問題,而且Xcode8
的bug
,解決辦法 -> 在終端輸入下面一行命令,輸入后會要求輸入密碼,等待幾秒后,就完成了,然后重啟電腦就行了
sudo /usr/libexec/xpccachectl
LaunchImage
加載LaunchImage
的方法有兩種:
- 直接使用Launch Screen File
- 使用Assets.xcassets里面的LaunchImage文件
一般都是使用第二種方法,在配置這個文件的有幾點需要注意
1 四個尺寸的圖一定要一一對應(yīng),就是對應(yīng)的坑里放對應(yīng)大小的圖片,不然不能用,運行的時候不顯示;當然,你放錯了圖片,Xcode
會直接給予警告的
2 放好圖片以后,當然要測試了,一般情況下,你直接運行是不會顯示的,即使你的圖片放置的都正確,這個時候你必須刪除模擬器/手機原來的那個項目,再次運行才會顯示.
swift中使用系統(tǒng)關(guān)鍵字
一般情況下,最好不要使用系統(tǒng)關(guān)鍵來命名
但是也有特殊情況,非得使用不可,那么這個時候就需要使用''
符號來包裹該關(guān)鍵字才可以
示例:
/// Returns a default `URLEncoding` instance.
public static var `default`: URLEncoding { return URLEncoding() }
注釋標簽
在開發(fā)中,注釋是必不可少的一部分,一份注釋良好的代碼可以幫助維護者快速上手;通常我們會使用mark
標簽來表明一個段落代碼的用意:
// MARK: 這里是邏輯業(yè)務(wù)
// MARK: 這里是界面設(shè)置
當然,注釋標簽不僅僅只有這一個,還有TODO
,這是一個非常有用的標簽,你可以在TODO
后面寫上你未完成的事情,這樣對你或維護者都是一種負責任的表現(xiàn):
// TODO: 這里還有一些沒有完成
// FIXME: 這里有些bug要修復(fù)
當你使用TODO
和FIXME
標簽的時候,你會發(fā)現(xiàn)在其左側(cè)的圖標都同MARK
不一樣
有人可能對覺得這幾個標簽是在swift中使用的,其實不然,現(xiàn)在已經(jīng)通用了,他們在Objective - C
的環(huán)境中也一樣可用,因為他們只是針對Xcode的;
當然如果你習(xí)慣下面這種寫法也不是不可以的,但是下面這種方式只能在Objective - C
中使用,Swift3.0
以后就不能使用了
#pragma mark - 這里是邏輯業(yè)務(wù)
#pragma mark - 這里是界面設(shè)置
返回值警告問題
在Swift
中,有些方法會默認有返回值,而這些值你可能會用不到,這個時候編譯器就會給你警告:xxx is unused
這個時候我們可以使用 _
來接收一下,其實不接收也沒有關(guān)系,然而強迫癥和處女座的同學(xué)可能會有點兒...
_ = self.navigationController?.popViewController(animated: true)
storyboard/xib上拖tableview上方空白問題
在storyboard/xib
上拖一個tableview
有時候,上方會空出一片空白,同時你運行的時候也會出現(xiàn)相應(yīng)的空白區(qū),就算你的約束設(shè)置為0
也是不行的
解決辦法如下:
CoreData存儲使用Transformable類型存儲失敗
使用coredata
存儲的時候,如果你需要存儲一些復(fù)雜類型的時候,你可能會選擇transformable
格式,這個沒有問題,但你可能會遇到這樣的情況:其他都能存進去,而transformable
類型的存不進去??
解決辦法:查看你要存儲的數(shù)據(jù)類型有沒有遵循NSCoding
協(xié)議,因為只有遵循了該協(xié)議的類型才能夠使用transformable
類型存儲
CoreData自動子類化問題
如果你是一個coredata
使用者,那么你一定遇到過這樣的問題,當你創(chuàng)建好entity
以后,使用Xcode
的自動子類化(editor -> Creat xx Classes
),這個時候Xcode
會自動為你創(chuàng)建好兩個類,分別是:
- entityName + CoreDataClass
- entityName + CoreDataProperties
然后你開心打開文件后,發(fā)現(xiàn),一片紅色...
然后你開始如下步驟來回循環(huán):
- command + K
- command + B
- 蒙逼一小會兒
- 繼續(xù)步驟1
造成這個問題的原因是,你在創(chuàng)建的時候沒有把對應(yīng)entity
的自動創(chuàng)建給勾選掉;
也就是說,其實Xcode
在你創(chuàng)建這個entity
的時候已經(jīng)創(chuàng)建了上面兩個類了,只是沒有直接添加在Xcode
里面
而是隱藏在build
文件里面路徑如下
/Users/<your user name>/Library/Developer/Xcode/DerivedData/AppName-agkwmibzbopevjgfajlcbyixzyev/Build/Intermediates/AppName.build/Debug-iphonesimulator/AppName.build/DerivedSources/CoreDataGenerated/Model
簡直深不可測,誰能想到在這里?筆者能發(fā)現(xiàn)是因為使用了全局搜索(好像搜了差不多10分鐘...)
解決辦法:
把系統(tǒng)自動創(chuàng)建的那倆貨刪掉,按照上面的路徑找到他們.
what?還不行?
把derivedData
里面帶有你項目名稱的文件夾刪掉,然后在把工程里面之前創(chuàng)建的那倆類也刪掉,再然后選中要子類化的entity
,再然后把右側(cè)Data Model Inspector
里面的Codegen
屬性修改為Manual/None
,最后再去創(chuàng)建
Archives - Crashes窗口
在打包上架的時候,你可能會來回打包幾次,畢竟會有各種問題出現(xiàn);
有些人使用電腦的習(xí)慣是,只要不用的窗口立馬: command + w
然后想去找Archives - Crashes
列表發(fā)現(xiàn)已經(jīng)關(guān)閉了,怎么辦?再打包一次,然后讓Xcode
自己打開 ?
其實,Xcode
是有這個界面的快捷打開方法的,Window -> Organizer
??
Swift中Extension重寫方法問題
在寫swift
的時候經(jīng)常會遇到這樣的問題:在extension
中override
父類的方法,沒有報錯,但是不執(zhí)行...
這個問題不是代碼的問題,也不是Xcode
的問題,是因為Extension里面本身就不支持,官方解釋如下:
Extensions can add new functionality to a type, but they cannot override existing functionality
如果非要這么做怎么辦?非要這么做不是不可以,如果父類是你自己寫的,那么你可以在父類相對應(yīng)的方法前面加上@dynamic
關(guān)鍵字
模態(tài)透明Controller不成功
在iOS
開發(fā)中經(jīng)常遇到這樣的需求,在某個頁面需要modal
出來一個高斯模糊的頁面(新浪微博的發(fā)微博頁面就是如此),效果如下:
在iOS 8
之前比較蛋疼,高斯模糊的view
要自己手動實現(xiàn),然而8之后就多了一個VisualEffectView
,如果還在適配iOS 7
的同學(xué)請自行跳過??
iOS 8
之后常規(guī)的思路是把view
的backgroundColor
修改為clearColor
,然后上面在放一個VisualEffectView
,然而事實上幺蛾子總會讓我們措手不及,modal
出來以后,下面view
的backgroundColor
會變,在完全modal
出來以后就自動變成白色了(如果你沒有設(shè)置window
的backgroundColor
,那么就是黑色)...
請看幺蛾子(總有一些坑想害朕??)
在遍尋Google
之后,找到了原因:
NavigationController and the View Controllers are designed in such a way that only one view controller may show at a time. When a new view controller is pushed/presented the previous view controller will be hidden by the system. So when you reduce the modal view's alpha you will possibly see the window's backgroundColor (the black color you see now)
果然是系統(tǒng)干的,因為我們modal
出新的viewcontroller
以后,系統(tǒng)把其隱藏了,導(dǎo)致我們底部直接看到了window
,所以,那個白色其實是window
的顏色??
所以,要修改他們的關(guān)系,解決辦法,就是設(shè)定你要modal的controller的modalPresentationStyle,代碼如下:
// swift
toViewController.modalPresentationStyle = .overCurrentContext
// OC
toViewController.modalPresentationStyle = UIModalPresentationOverCurrentContext;
生命不息吠各,折騰不止...
I'm not a real coder, but i love it so much!