Note 24 ScrollView,觀察者,兩種文件管理結(jié)合

JSONFile

  1. 將對象屬性保存到字典里

  2. 然后將字典JSON化

  3. 用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

  • 單例類 :只有一個對象
  1. let app = UIApplication.sharedApplication()
  2. let ud = NSUserDefaults.standardUserDefaults()
  3. let fileManager = NSFileManager.defautlManager()
  4. ...等等

獲取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ù)

  1. 只讀
  2. 只寫
  3. 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能否滾動

  1. scrollEnabled
  2. 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 顯示滑動指示器
  • 可以通過setContentOffsetscrollRectToVisible,偏移到一個點(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)聽存儲屬性
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容