這是用Swift做項目遇到的問題記錄,主要是供自己記錄北专,如果有人碰巧搜索看到,有些你可能看不懂旬陡。不過這也沒關系拓颓,因為所有問題是基本都是在stackoverflow找到的答案,所以你去查就是了描孟。
一些開發(fā)過程經驗:
1)關于唯一識別的問題驶睦,通常使用 NSUUID, 例子: let uuid = NSUUID().UUIDString. 至于使用objectid作為唯一標示還未弄清楚,因為查詢多個結果時匿醒,其objectid是編號的场航。
- 關于tableView的行刪除,先要保證數(shù)據(jù)源的數(shù)據(jù)以刪除才能刪除行廉羔。否則出錯“ Assertion failure in -[UITableView _endCellAnimationsWithContext:”
請參看帖子:http://blog.sina.com.cn/s/blog_7b9d64af0101b6se.html
3) 頁面跳轉方式:
a) 采用在storyboard跳轉方式
let storyboard = UIStoryboard(name: "Main", bundle: nil); let vc = storyboard.instantiateViewControllerWithIdentifier("login") as UIViewController;
self.navigationController?.pushViewController(vc, animated: true) (push)
// self.presentViewController(vc, animated: true, completion: nil) (modal)
b)采用segue方式
self.performSegueWithIdentifier("segueShowRemind", sender: self)
c) 如果只是為了刷新數(shù)據(jù)溉痢,可以直接再次調用 viewdidload
4)ttt
5)獲取coredata數(shù)據(jù)時的排序方式:1) http://stackoverflow.com/questions/25548587/sorting-array-received-from-core-data-in-swift ,2)http://www.bubuko.com/infodetail-566143.html, 3)http://www.linuxidc.com/Linux/2015-09/122778.htm
6)關于數(shù)據(jù)刷新,每次在viewWillAppear執(zhí)行reload tableView是不合適的憋他,性能影響大孩饼,應該用其他方式,比如 http://blog.sina.com.cn/s/blog_7b9d64af0101b82p.html
- 關于NSDate與String的轉換举瑰,需要注意自定定義數(shù)據(jù)格式捣辆,否則從NSDate轉不出字符蔬螟。
let dateFormat: NSDateFormatter = NSDateFormatter() dateFormat.dateFormat = "yyyy-mm-dd HH:mm:ss EEEE"
var time:String = dateFormat.stringFromDate(date)
8)關于 coredata查詢句子的語法此迅, 條件查詢是用 &&, || 等旧巾,代碼參考:
9) 關于codedata的數(shù)據(jù)查找耸序,注意條件的格式,對于整型鲁猩、字符的條件坎怪,其使用格式不一樣。比如下面錯誤提示廓握,就是等號右側未加引號搅窿,因為id定義是String嘁酿。 Unable to parse the format string "uid = F657D3B0-F482-44B2-B0FC-5FC1FBFF28C4"'
10) 關于變量 optional定義,會引入optional字符男应,導致數(shù)據(jù)錯誤闹司。如果打印輸出發(fā)現(xiàn)有optional,在變量后增加沐飘!即可游桩。
在vc隱藏tabbar,bottom bar的方法:http://segmentfault.com/a/1190000000327529
a.最簡單就是直接在storyboard 設置“hide bottom bar on push”耐朴,
b. 在上級vc viewdidload增加 : self.hidesBottomBarWhenPushed = true //隱藏低欄如何調整nav bar的高度借卧,關聯(lián)outlet,然后 navigationBar.frame = CGRectMake(0, 0, 100, 80)
13)設置static table筛峭,關聯(lián)tableViewVC后铐刘,記得不里面關于表格的代碼屏蔽,否則就不顯示內容影晓。
- 設置tableview的table的section的距離(間距) :http://blog.csdn.net/jimy86022/article/details/21702051
15)關于userdefault臨時存儲東西滨达,在appdelegate先進行初始化,這樣后面調用就不容易出現(xiàn)問題俯艰。
16)注意在auto layout情況下捡遍,如果沒有設定好constraint在模擬器上顯示不完整的,所以就看不到了竹握。比如如果在tableView沒有設定與view的constraint画株,滑動刪除按鈕因為在最右邊,所以看不到啦辐。
17)登錄界面的過渡(segue)用戶modal谓传,取消/成功用戶unwind過渡,unwind是個IBAction 芹关。 而一般表格點擊到新頁面用戶prepareSegue续挟。
18) 關于模擬器輸入法選擇,在模擬器中選擇setting侥衬,即像手機那樣操作诗祸。
關于藍牙鏈接的文章:
a. 建立連接的文章:http://2goo.info/weblog/detail/232351
b. 最佳實踐:http://southpeak.github.io/blog/2014/08/01/core-bluetoothkuang-jia-zhi-san-:zui-jia-shi-jian/
- 關于事件捕捉,比如關閉鍵盤轴总;當tableview上的textField直颅,用戶touchEnd方法是沒辦法關閉鍵盤的,如下有兩種方式可以通過識別手勢從而觸發(fā)關閉鍵盤代碼:
a: 通過捕捉tableview滾動的事件怀樟,然后觸發(fā)(推薦)功偿。
func scrollViewWillBeginDragging(scrollView: UIScrollView)
b: 通過 UITapGestureRecognizer 定義一個手勢,然后綁綁定到tableview
20)用代碼定義導航欄上的左右按鈕往堡,
navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Refresh, target: self, action: "refresh")
關于藍牙功能
服務UUID****:****Device Informationservice: <CBCharacteristic: 0x1653fd80, UUID = PnP ID, properties = 0x2, value = (null), notifying = NO>****
服務UUID****:FFE0
21) webView訪問地址時械荷,會涉及訪問權限的錯誤共耍,
22) 如何在auto layout把3個view平均分布在界面上 https://lvwenhan.com/ios/431.html
圖表控件,charts吨瞎, 用pod安裝后征堪,要先run一次,才能import关拒,在github已經提過
iOS 9 集成社會化分享的若干問題
當前還是用openshare比較簡單佃蚜,但還有集成問題為解決。
25)指定日期格式顯示着绊,可看看如下帖子:
http://my.oschina.net/yongbin45/blog/150667
關于“OBJC_CLASS”谐算、“l(fā)inker command failed with exit code1”的問題
自己這邊原因是引入openshare庫的問題,用pod引入的并不生效归露,自己在xcode拷貝文件夾的方式就生效了洲脂。leanCloud的表在創(chuàng)建第一條數(shù)據(jù)時就已經明確了數(shù)據(jù)的類型,特別是索引剧包,所以后續(xù)數(shù)據(jù)必須按照執(zhí)行
28) 關于iOS信息推送設置:
a. 按照leanCloud的證書設置指南恐锦,把測試和生產的證書制作出來,即push service兩個疆液,app develop兩個一铅。
b. 按上面操作在網頁生成cer文件,雙擊證書會添加到“鑰匙串訪問 ”堕油。
c. 在xcode設置應用使用的證書(上iTunes要用正式證書)潘飘,http://www.reibang.com/p/986e02d38f1b
d. 在leanCloud導入證書,有一點要注意的是掉缺,測試時 LC和APP都用戶測試證書卜录,上線就都用正式證書。
29)從LC獲取圖片眶明,使用下面方法
a. 通過Url方為
func demoCombineQiniuApi() {
getDemoFile { (file) -> Void in let thumbnailFile = AVFile(URL: "(file!.url)?imageView/1/w/50/h/100") thumbnailFile.getDataInBackgroundWithBlock({(data: NSData?, error: NSError?) in if self.filterError(error) { let image: UIImage = UIImage(data: data!, scale: UIScreen.mainScreen().scale)! self.showImage(image) self.log("成功用七牛接口獲得縮略圖") } }) }
}
b. 通過objectId
func getDemoFile(block : (file: AVFile!) -> Void) { AVFile.getFileWithObjectId("5573fddee4b06a32094af62b", withBlock: { (file: AVFile?, error: NSError?) -> Void in if self.filterError(error) { block(file:file) } })
}
30)關于圖片壓縮艰毒,
whatsapp的圖片壓縮: https://www.built.io/blog/2013/03/improving-image-compression-what-weve-learned-from-whatsapp/
- 關于圖片的全屏展示,可參考leanStorageDemoSwift的“ showImage”方法
關于創(chuàng)建搜囱、修改提醒時丑瞧,圖片處理邏輯:
重點:要上傳的圖片應該放在userDefault的“upLoadImage”里。
0)按鈕有默認的圖片犬辰。
1)新創(chuàng)建提醒
a. 選擇圖片嗦篱,把圖片緩存到userDefault, 界面從useDefault讀取顯示
- 修改提醒
a. 從網絡獲取圖片幌缝,如果值不為nil,就賦值給userDefault
不管哪種情況诫欠,保存時判定一下userDefault的upLoadImage的值是為為空涵卵。
32) 關于segue返回上兩步的方案浴栽, 見這個文章
http://stackoverflow.com/questions/7005787/how-to-identify-previous-view-controller-in-navigation-stack
33)UITextVIew的應用 (自動修改長度,自動判斷連接轿偎、電話典鸡、email)
自動判斷高度:直接autolayout就可以
識別連接:http://stackoverflow.com/questions/5964434/how-to-a-clickable-url-email-phone-number-on-uitextview
34) 自定義TabBar
http://www.reibang.com/p/e81547c3eda7
插件:類instagram https://github.com/boctor/idev-recipes/tree/master/RaisedCenterTabBar
tabbar動態(tài)效果:https://github.com/Ramotion/animated-tab-bar
more插件: http://code4app.com/ios/Raised-Center-Tab-Bar/4f68162c6803fa791c000003
- 導航條的顏色修改,見下連接坏晦; 關于如何修改icon的顏色萝玷,可以修改圖片也可以把它定義為模板,然后調整色值
http://www.cocoachina.com/ios/20150703/12363.html
直接一次性修改導航背景顏色昆婿,用代碼可看這里 :https://developer.xamarin.com/recipes/ios/content_controls/navigation_controller/change_the_nav_bar_color/
36) 在tableHeadView展示textView(自適應內容size)
a) 正常把textView拖到headView內球碉,不勾選“scroll enabled”。
b ) 設置 上下左右的autolayout仓蛆,注意不要設置高度睁冬。 就著兩步,就可以實現(xiàn)textView的自適應看疙。
c )接下來的問題主要是如下使上層的view能夠自適應高度豆拨,用下面兩句代碼就可以實現(xiàn)。
let s = tableHeadView.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize)
print(s.height)
tableHeadView.frame.size.height = s.height
簡單而已就是重新獲取view內元素的高度能庆,然后刷新view高度施禾。 需要注意view內的其他元素,比uilabel如果顯示多行的話搁胆,其高度需要被刷新拾积,因為view并沒有統(tǒng)計變化后的高度。
如果UILabel超過1行丰涉,代碼舉例: remindTitle.sizeToFit()
37) 在tableHeadView展示圖片拓巧,在autolayout下讓圖片在屏幕寬度基礎上比例輸出
1. 首先計算出原圖片 高度、寬度和寬高比一死。 (例子: let imageHeight = imageView.image?.size.height)
2. 因為用戶了autolayout肛度,通過imageView.frame并不能獲取圖片在手機展示的真實尺寸,所以采用折中方法從screen獲取投慈,如 let rect = UIScreen.mainScreen().bounds.size.width
3. 屏幕的寬度與autolayout的imageView寬度差不多承耿,所以就可以用屏幕寬度和圖片比例計算出imageView的高度。
4.還有一個要注意伪煤,因為在autolayout為了避免constraint出錯加袋,所以給imageView設置了固定高度,并建立IBOutlet抱既,如 @IBOutlet weak var imageHeightContraint:NSLayoutConstraint?职烧, 所以步驟3計算的值就給這里賦值。
38) 關于tableViewCell插入圖片時,其高度的問題蚀之,正常做法用subclass保存cell蝗敢,然后在cell設置auto layout,在程序運行時修改constraint足删。 我目前做法沒有設subclass寿谴,不設置image的高度,但auto layout就報紅色失受,但目前運行沒影響讶泰。
39) 在button增加action時,遇到crash情況拂到,原因是對應方法如果有參數(shù)痪署,就要增加冒號,如下所示谆焊。
func likeCheckIntemp(sender:AnyObject) {}
cell.likeButton.addTarget(self, action: "likeCheckIntemp:", forControlEvents: UIControlEvents.TouchUpInside)
40)UITableViewCell圖片加載錯亂問題
http://stackoverflow.com/questions/16663618/async-image-loading-from-url-inside-a-uitableview-cell-image-changes-to-wrong
-
用xib后惠桃,在checkIn列表點擊comment按鈕,sender的值不同辖试,原來是button辜王,用戶xib后是整個VC
貌似可以用如下方法解決,在button增加tag罐孝,傳值時傳過去:http://stackoverflow.com/questions/24814646/attach-parameter-to-button-addtarget-action-in-swift
進展:暫還不要連接的解決方式呐馆,因為問題是自己在segue傳值時沒把值傳過去,按下面?zhèn)鬟^去就好莲兢。
func commentCheckIn(sender:AnyObject) { self.performSegueWithIdentifier("segueToComment", sender: sender)
}
42) 關于tableView的自動行高汹来,如下面代碼;如果label要多行改艇,在storyboard上選line=0self.tableView.rowHeight = UITableViewAutomaticDimension;
self.tableView.estimatedRowHeight = 44.0; // 設置為一個接近“平均”行高的值 在UITableViewController上定義底部toolbar問題: 1)toolbar有跳躍才回到底部收班。2)而且影響previous的view。經過多次嘗試谒兄,最后在該tableViewVC定義其位置摔桦,在viewWillDisappear隱藏toolbar
44) 在tableView刪除某行時,出錯“ Invalid update: invalid number of rows in section 0 ...” 大概意思是刪除時行數(shù)不一致造成錯誤
- 補充記錄承疲,如何使用XIB邻耕?
- 首先創(chuàng)建xib文件和對應swift文件
- 對應tableViewCell,要先在storyboard的cell上選擇class和identifier與xib相一致
- 在swift文件的cellForRowIndexPath 注冊xib文件燕鸽,樣式如下:
tableView.registerNib(UINib(nibName: "RemindListTableViewCell", bundle: nil), forCellReuseIdentifier: "RemindListCell")
let cell = tableView.dequeueReusableCellWithIdentifier("RemindListCell", forIndexPath: indexPath) as! RemindListTableViewCell
45)點back時的反向傳參數(shù) (通過代理實現(xiàn)實時傳參數(shù))
http://stackoverflow.com/questions/24298413/how-to-pass-information-back-in-ios-when-reversing-a-segue-using-swift
這個實現(xiàn)方式更代碼更少
http://stackoverflow.com/questions/24318480/passing-data-in-swift/24318588#24318588
6步實現(xiàn)代理簡單教程 http://www.reibang.com/p/b077bcd4b168
46) 關于下級VC修改要同步到上級VC的問題兄世,只要通過segue把數(shù)據(jù)傳遞,并且上級返回時沒有重復取值啊研,下級的修改會直接同步到上級VC御滩,因為他們實際是同一值鸥拧,存在同一個內存區(qū)。
46)觸發(fā)提醒的最合適時機是基于使用場景艾恼。詳細見文章:
http://techcrunch.com/2014/04/04/the-right-way-to-ask-users-for-ios-permissions/
47) iOS的推送問題排查住涉,請看這里:
https://leancloud.cn/docs/push_guide.html#推送結果查詢
48)如何在自己項目添加playground麸锉? 大概意思就是用playground調用項目函數(shù)
https://medium.com/@LogMaestro/adding-playgrounds-to-your-xcode-project-79d5ea0c7087#.n38qa9dfw
- 關于deviceToken獲取钠绍,installation表更新邏輯
a. 不管是在app調用注冊通知,還是用戶剛開始沒注冊花沉,然后在setting點啟動柳爽,app都會在調用appDelegate的registerRemoteNotification獲取deviceToken
b. 我們要做的是在啟動和登錄時增加一個判斷,在installation表保證uid碱屁、deviceToken的對應上磷脯,并且是唯一性,老記錄要刪除娩脾。
50) 關于緩存方案赵誓, 有文章說,先在viewdidload加載所要的數(shù)據(jù)并且緩存柿赊,然后在viewwillappear
思考: 1. 單個提醒信息俩功,緩存5分鐘;修改時直接修改變量并且異步保存到服務器碰声。
- 由于保存圖片出錯诡蜓,出現(xiàn)右邊錯誤值Optional(<null>),在后臺看是空胰挑,但又不是nil蔓罚。 找了個判斷方法,通過長度來判斷瞻颂。
看下例子: //正常情況用不到豺谈,緊在保存照片時crash時才會導致出現(xiàn)null var imageNull = false if remindLC.valueForKey("image") is NSNull { imageNull = true
}
52)關于在checkFlow頁點擊“評論”,在評論頁不顯示 toolbar的問題贡这,經過反復嘗試茬末,目前找到解決方法是在checkFlow上層的navigation view的 storyboard設置 show toolbar, 然后后續(xù)push就有了藕坯。团南。但要注意后續(xù)想顯示bar的頁面需要hidden掉。
53) 經驗:
- 自己項目在showRemind有設置unwind segue的IBAction “close”炼彪,然后在修改remind頁只要設置segue并且指定“close”就能跳轉showRemind吐根,即使相隔了一個remindInfo的VC
2.沒有segue連接也能跳轉,夸view的unwind segue: 在storyboard右鍵點擊showRemindd”exit”辐马,然后可以拖著連接任何VC的Action拷橘,估計連接后就能到showRemind。 (這個還木有時間試)
關于unwind:http://stackoverflow.com/questions/12561735/what-are-unwind-segues-for-and-how-do-you-use-them
54) 關于在toolbar位置 發(fā)信對話框的實現(xiàn)經驗芥映。 這個問題最近修改時間花了1周酸钦,之前也折騰了1周骤星, 總結教訓是沒有很好地從基層原理去了解在孝,總希望找個控件就實現(xiàn)矢渊。 在實現(xiàn)過程中發(fā)信tableViewVC的實現(xiàn)比較麻煩侄柔,但由于不想切換到UIViewVC導致浪費了很多時間浑槽,其實在stackOverFlow的經驗都是用UIView實現(xiàn)的巫员。 不過經過這次诅挑,自己對frame位置變化四敞,view什么時候加載、鍵盤變化拔妥、textViewChange等有比較深刻的認識忿危。
- 修改app名字,
方法1:在info.plist文件修改 bundle display name https://developer.apple.com/library/ios/qa/qa1823/_index.html没龙, 應該是
方法2:在target的build setting铺厨,可以設debug、release的名字硬纤,在Xcode是出debug名字解滓,如何出release名字?
- 關于coreData數(shù)據(jù)保存: 只要創(chuàng)建了對象咬摇,數(shù)據(jù)庫就會增加一行數(shù)據(jù)伐蒂,所以如果remindId字段是在后續(xù)刷新,并且不能保證100%刷新肛鹏,就會出現(xiàn)后續(xù)調用remindId出錯crash情況逸邦。由于目前在保存是沒找到處理該問題的好方法,所以統(tǒng)一在app啟動時在扰,把remind表中沒有remindId的行刪除缕减。
57) 關于EULA, 好不容易找到一個用戶協(xié)議的模板芒珠。 http://www.wandoujia.com/ios/eyepetizer/agreement.html ““開眼”軟件用戶協(xié)議”
- 如何使用SearchBar and Search Display Controller, 請看視頻:https://www.youtube.com/watch?v=N9wcKc37ZXI桥狡,帖子: https://grokswift.com/swift-tableview-search-bar/
58) 水印功能實現(xiàn),在簡書找到別人共享代碼皱卓,目前發(fā)現(xiàn)問題是 圖片實際尺寸7501334裹芝,但在UIImage.size顯示尺寸1/2, 即375667。娜汁。經過調試只用用10801920圖圖片放到x2位置嫂易,那么在不同尺寸模擬器運行時都會是540960的size。所以就用這尺寸來制作水印掐禁。
59) 關于調用其他VC的方法怜械,之前不知道其實在Functions.swift里的functions就是VC方法颅和,現(xiàn)在又增加了WaterMarkVC.swift,日后應用可以把以前訪問checkInTableViewCell的那些請求做修改缕允。
- 關于leanCloud的靜態(tài)庫峡扩、動態(tài)庫引用問題: 之前一直是用靜態(tài)庫, 因為微信登錄原因需要使用leanCloudSocial庫障本,先引入靜態(tài)發(fā)現(xiàn)無法引入教届,再引入動態(tài)發(fā)現(xiàn)一堆錯誤。后來經過與leancloud的人論壇交流彼绷,采用動態(tài)庫后可用巍佑。
要注意:
1)相同的庫茴迁,靜態(tài)和動態(tài)只能選其一寄悯,因為是沖突的。
2)靜態(tài)庫的引用是在header文件上import(帶路徑)堕义,動態(tài)庫是在每個文件頭部import (無需路徑)
注意:帖子上說 動態(tài)庫不能用:https://forum.leancloud.cn/t/ios-sdk-swift/7589
61)可能是更新了cocoaPod引入問題猜旬,運行時有20多個錯誤,但在iPhone5模擬器倦卖、iPhone6s手機沒有問題洒擦。感覺是跟armv7、i386架構相關怕膛,后來在building settings 的valid architectures 增加“x86_64, i386” 然后就可以了熟嫩。
- 問題: ** a valid provisioning profile** for this excitable was not found,不知為為啥這個問題褐捻,實際上我的證書的木有問題的掸茅,自己處理是分別在project和target的 “Code Signing”重設一下就下,一般是選自動就好