Swift 使用 Observe 監(jiān)測頁面滾動(dòng)的實(shí)現(xiàn)方法
Swift 以前是通過addObserver
來實(shí)現(xiàn)對某個(gè)屬性的變化監(jiān)聽,而最新的變化,書寫起開更加方便。
observer = test.observe(\.field, options: [.new, .initial]) { (object, change) in print(change) }
一定要用屬性賦值當(dāng)前的 observe 結(jié)果,沒有的話可能會(huì)造成 change 不生效。
對 UIScrollView 的滾動(dòng)監(jiān)聽,我們可以使用UIScrollViewDelegate
extension UIScrollViewDelegate{ func scrollViewDidScroll(scrollView: UIScrollView){ //do something } }
這里推薦使用 Observe 比較方便的是可以進(jìn)行模塊的邏輯的拆分,我們只需在自己的組件里面進(jìn)行監(jiān)聽
class ComponetView: UIVIew { private var observation: NSKeyValueObservation? init(targetView: UIView) { observation = targetView.observe(\.contentOffset, options: [.new]) { [weak self] scrollView, change in // handle data contentOffset } } }
附錄:Swift中實(shí)現(xiàn)Observable機(jī)制
今天給別人講個(gè)Observable的實(shí)現(xiàn)和使用場景,結(jié)合Observable-Swiftgithub:https://github.com/slazyk/Observable-Swift講了半天貌似還沒有特別明白,故寫了個(gè)簡易的實(shí)現(xiàn),講述了下Observable屬性監(jiān)控機(jī)制。
//: Playground - noun: a place where people can play import UIKit import Foundation // MARK: - Observable class Observable<T> { // 定義block結(jié)構(gòu) typealias Observer = T -> Void // 申明一個(gè)block,用于數(shù)據(jù)改變的執(zhí)行 private var observer: Observer? // 數(shù)據(jù)發(fā)生變更,則通過observer告知 var value: T { didSet { observer?(value) } } init(_ v: T) { value = v } func observe(observer: Observer?) { self.observer = observer observer?(value) } } // MARK: - People struct PeopleModel { let firstName: Observable<String> let lastName: Observable<String> init(firstName: String, lastName: String) { self.firstName = Observable(firstName) self.lastName = Observable(lastName) } } // MARK: - Test // test1 let people = PeopleModel(firstName: "sunny", lastName: "liu") people.firstName.observe { newValue in print("firstName changed: \(newValue)") } people.lastName.observe { print("lastName changed: \($0)") } people.firstName.value = "sunny2" people.lastName.value = "liu2" // test2 class House { let lableHouseName = UILabel() init() { } var people: PeopleModel? { didSet { people?.firstName.observe{ [unowned self] in self.lableHouseName.text = $0 } } } }
這樣貌似容易理解了,O(∩_∩)O哈哈~
總結(jié)
到此這篇關(guān)于Swift 使用 Observe 監(jiān)測頁面滾動(dòng)的文章就介紹到這了,更多相關(guān)Swift 使用 Observe 監(jiān)測頁面滾動(dòng)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
因?yàn)橐粋€(gè)Crash引發(fā)對Swift構(gòu)造器的思考分析
這篇文章主要給大家介紹了關(guān)于因?yàn)橐粋€(gè)Crash引發(fā)對Swift構(gòu)造器的思考分析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者使用Swift具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10Swift語言實(shí)現(xiàn)地圖坐標(biāo)彈跳動(dòng)畫
這篇文章主要介紹了用Swift語言實(shí)現(xiàn)地圖坐標(biāo)彈跳動(dòng)畫的方法主要應(yīng)用iOS7來實(shí)現(xiàn)此功能,需要的朋友可以參考下2015-07-07Swift并發(fā)系統(tǒng)并行運(yùn)行多個(gè)任務(wù)使用詳解
這篇文章主要為大家介紹了Swift并發(fā)系統(tǒng)并行運(yùn)行多個(gè)任務(wù)使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06Swift 3.0將UILabel數(shù)字顏色設(shè)置為紅色的方法
這篇文章主要介紹了關(guān)于在Swift中將UILabel數(shù)字顏色設(shè)置為紅色的方法,文中給出了詳細(xì)的示例代碼,相信對大家具有一定的參考價(jià)值,需要的朋友們下面來一起看看吧。2017-03-03