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 创建文件,可以写入NSData
creatDirectoryAtPath 创建文件夹
//程序局部性
let fileManager = NSFileManager.defaultManager()
//管理文件、文件夹
//创建、删除、移动、复制
//整个文件的管理
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
创建fileHandle对象 -> 有三种创建对象的构造函数
- 只读
- 只写
- update(both)
不同的文件标识类型只能执行相关的操作
offset
每个对象操作完一次,都有指针记录当前操作的位置,下次继续使用相同对象操作就能继续
seekTofileOffset
跳到指定位置
一个新的fireHandle对象读写都是从0开始
操作完一定要CloseFile
//NSFileHandle
//1. 没有创建文件的能力,只能用于操作文件内容
//Read: 只读
//Update: 修改
//Write: 只写
let fileHandle = NSFileHandle(forReadingAtPath: path)
//偏移量:记录当前已经操作到文件的某个位置
//每一次操作都会导致偏移量自动发生变化
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
两个特点
- 滚动
- 缩放
UIScrollView能否滚动
- scrollEnabled
- contentSize:(0,0) 内容大小,只有超过本身尺寸才能滚动
UIScrollView缩放
通过实现协议代理UIScrollViewDelegate里的scrollViewDidZoom
方法返回一个UIView(类)的子视图,该视图可以缩放
func scrollViewDidZoom(scrollView: UIScrollView) {
<#code#>
}
UIScrollView 一些属性设置
- pagingEnabled 分页设置
- scrollView.contextInset = UIEdgeInsets()设置边缘间隙
- scrollView.contextOffset = CGPoint() 设置偏移/正方向:左,上(拖动的方向)
- scrollView.directionalLockEnabled/Bool 一次只允许一个方向滚动
- scrollView.bounces/Bool 弹性效果
- scrollView.showHorizontalScrolIndicator/Vertical 显示滑动指示器
- 可以通过
setContentOffset
和scrollRectToVisible
,偏移到一个点,或者使一个矩形区域显示,来实现视图偏移
UIScrollViewDelegate中的一些方法:
ScrollView停止的时机
//两种停止方式
//一种是拖动松手,减速停止
//一种是拖动,然后停止,再松开手,不用减速
//结束拖动
func scrollViewDidEndDragging(scrollView: UIScrollView, willDecelerate decelerate: Bool) {
if decelerate {
print("EndDragging,要减速")
}
else {
print("EndDragging,不用减速")
}
}
//结束减速
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
//无视所有访问权限控制 -- OC里面
//swift里面如果设置了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")
设置观察者方法
override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
print(keyPath)
print(object)
print(change)
//一旦被观察的对象值发生改变就会调用
//监听存储属性
}
网友评论