JSONFile
將對象屬性保存到字典里
然后將字典JSON化
用NSData的writeTo 方法保存到文件中
let data = try! NSJSONSerialization.dataWithJSONObject(dict, options: [])
let s = NSString(data: data, encoding: NSUTF8StringEncoding)//JSON化(NSData類型)
print(s!)
let path1 = NSHomeDirectory() + "/Documents/1.json"
try! data.writeToFile(path1, options: .AtomicWrite)
fileManger
- 單例類 :只有一個對象
- let app = UIApplication.sharedApplication()
- let ud = NSUserDefaults.standardUserDefaults()
- let fileManager = NSFileManager.defautlManager()
- ...等等
獲取fileManger對象
let fileManager = NSFileManager.defaultManager
fileExistAtPath 判斷文件是否存在
removeItemAtPath 刪除文件
creatFileAtPath 創(chuàng)建文件,可以寫入NSData
creatDirectoryAtPath 創(chuàng)建文件夾
//程序局部性
let fileManager = NSFileManager.defaultManager()
//管理文件、文件夾
//創(chuàng)建、刪除、移動、復(fù)制
//整個文件的管理
let path = NSHomeDirectory() + "/Documents/1.plist"
print(path)
if fileManager.fileExistsAtPath(path) {
print("文件存在")
// try! fileManager.removeItemAtPath(path)
}
else {
let s = "A zoo in Changsha!"
fileManager.createFileAtPath(path, contents: s.dataUsingEncoding(NSUTF8StringEncoding), attributes: nil)
}
let dir = NSHomeDirectory() + "/Documents/2/3/4"
try! fileManager.createDirectoryAtPath(dir, withIntermediateDirectories: true, attributes: nil)
let attrs = try! fileManager.attributesOfItemAtPath(path)//文件屬性
print(attrs[NSFileSize])
fileHandle
創(chuàng)建fileHandle對象 -> 有三種創(chuàng)建對象的構(gòu)造函數(shù)
- 只讀
- 只寫
- update(both)
不同的文件標(biāo)識類型只能執(zhí)行相關(guān)的操作
offset
每個對象操作完一次,都有指針記錄當(dāng)前操作的位置,下次繼續(xù)使用相同對象操作就能繼續(xù)
seekTofileOffset
跳到指定位置
一個新的fireHandle對象讀寫都是從0開始
操作完一定要CloseFile
//NSFileHandle
//1. 沒有創(chuàng)建文件的能力,只能用于操作文件內(nèi)容
//Read: 只讀
//Update: 修改
//Write: 只寫
let fileHandle = NSFileHandle(forReadingAtPath: path)
//偏移量:記錄當(dāng)前已經(jīng)操作到文件的某個位置
//每一次操作都會導(dǎo)致偏移量自動發(fā)生變化
let data1 = fileHandle?.readDataOfLength(1) //NSData
print(data1?.length)
print(NSString(data: data1!, encoding: NSUTF8StringEncoding))
let data2 = fileHandle?.readDataOfLength(2)
print(NSString(data: data2!, encoding: NSUTF8StringEncoding))
fileHandle?.seekToFileOffset(0)
let data3 = fileHandle?.readDataOfLength(1)
print(NSString(data: data3!, encoding: NSUTF8StringEncoding))
let s = "B C"
let fileHandle2 = NSFileHandle(forWritingAtPath: path)
fileHandle2?.writeData(s.dataUsingEncoding(NSUTF8StringEncoding)!)
fileHandle?.closeFile()
fileHandle2?.closeFile()//操作完一定要CloseFile
SrollView
兩個特點(diǎn)
- 滾動
- 縮放
UIScrollView能否滾動
- scrollEnabled
- contentSize:(0,0) 內(nèi)容大小,只有超過本身尺寸才能滾動
UIScrollView縮放
通過實(shí)現(xiàn)協(xié)議代理UIScrollViewDelegate里的scrollViewDidZoom方法返回一個UIView(類)的子視圖,該視圖可以縮放
func scrollViewDidZoom(scrollView: UIScrollView) {
<#code#>
}
UIScrollView 一些屬性設(shè)置
- pagingEnabled 分頁設(shè)置
- scrollView.contextInset = UIEdgeInsets()設(shè)置邊緣間隙
- scrollView.contextOffset = CGPoint() 設(shè)置偏移/正方向:左,上(拖動的方向)
- scrollView.directionalLockEnabled/Bool 一次只允許一個方向滾動
- scrollView.bounces/Bool 彈性效果
- scrollView.showHorizontalScrolIndicator/Vertical 顯示滑動指示器
- 可以通過
setContentOffset和scrollRectToVisible,偏移到一個點(diǎn),或者使一個矩形區(qū)域顯示,來實(shí)現(xiàn)視圖偏移
UIScrollViewDelegate中的一些方法:
ScrollView停止的時機(jī)
//兩種停止方式
//一種是拖動松手,減速停止
//一種是拖動,然后停止,再松開手,不用減速
//結(jié)束拖動
func scrollViewDidEndDragging(scrollView: UIScrollView, willDecelerate decelerate: Bool) {
if decelerate {
print("EndDragging,要減速")
}
else {
print("EndDragging,不用減速")
}
}
//結(jié)束減速
func scrollViewDidEndDecelerating(scrollView: UIScrollView) {
print("減速完成")
}
collectionView是繼承ScrollView,也有ScrollView的屬性
KVC
通過SetValue - key/keyPath
class Food: NSObject {
var name: String!
}
class Animal: NSObject {
var name: String!
var age: Int!
var weight: Double!
var food: Food!
}
ani.name = "Zhangsan"
print(ani.name)
//KVC - Key value coding
//keyPath
//無視所有訪問權(quán)限控制 -- OC里面
//swift里面如果設(shè)置了private就不能訪問
ani.setValue("Lisi", forKey: "name")
print(ani.name)
print(ani.valueForKey("name"))
let food = Food()
food.name = "骨頭"
ani.food = food
print(ani.food.name)
ani.setValue("耗子", forKeyPath: "food.name")
print(ani.food.name)
print(ani.valueForKeyPath("food.name"))
KVO key - value observing
swift 里面只能觀察到 通過KVC改變的值
//KVO - key-value observing
//self觀察ani的name屬性的變化
ani.addObserver(self, forKeyPath: "name", options: [.New], context: nil)
//會通知觀察者
ani.setValue("Dog", forKeyPath: "name")
// ani.name = "Cat"
ani.setValue("Cat", forKey: "name")
ani.removeObserver(self, forKeyPath: "name")
設(shè)置觀察者方法
override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
print(keyPath)
print(object)
print(change)
//一旦被觀察的對象值發(fā)生改變就會調(diào)用
//監(jiān)聽存儲屬性
}