SwiftUI - 包裝UIView

UIViewRepresentable SwiftUI 尚未能實現,將 UIKit 中已有的部分進行封裝,提供給 SwiftUI 使用 UIViewRepresentable 協議提供了在 SwiftUI 中封裝 UIView 的功能 此協議需要實作2個方法 protocol UIViewRepresentable: View { associatedtype UIViewType: UIView func makeUIView(context: Self.Context) -> Self.UIViewType func updateUIView(_ uiview: Self.UIViewType, context: Self.Context) } makeUIView(context:) 需要返回想要封裝的 UIView 類型,SwiftUI 在創建一個被封裝的 UIView 時會調用此方法 updateUIView(_:, context:) 則在 UIViewRepresentable 中的某個屬性發生變化,SwiftUI 要求更新該 UIKit 部件時被調用 例:在SwiftUI使用UIKit的UIVisualEffectView import SwiftUI import UIKit struct BlurView: UIViewRepresentable { let style: UIBlurEffect.Style func makeUIView(context: UIViewRepresentableContext<BlurView>) -> UIView { let view = UIView(frame: ....

2022-07-17 08:00 · 1 min · Tientien

RxSwift - Combination Operators

Combination Operators 將多個 Observable 組合成單個 Observable 運算符。 startWith 開始從某個 Observable 發出元素之前發出指定的元素序列。 每個連續的 startWith 元素都將在前一個 startWith 元素之前添加。 let disposeBag = DisposeBag() Observable.of("A", "B", "C", "D") .startWith("1") .startWith("a", "b", "c") .subscribe(onNext: { print($0) }) .disposed(by: disposeBag) 印出結果 a b c 1 A B C D merge zip combineLatest switchLatest withLatestFrom

2022-02-17 20:35 · 1 min · Tientien

RxSwift - take、distinctUntilChanged

take 從 Observable 中發出頭 n 個元素,忽略後面的元素直到序列結束。 let disposeBag = DisposeBag() Observable.of("🐱", "🐰", "🐶", "🐸", "🐷", "🐵") .take(3) .subscribe(onNext: { print($0) }) .disposed(by: disposeBag) 印出結果 🐱 🐰 🐶 distinctUntilChanged 阻止 Observable 發出相同的元素。如果後一個元素和前一個元素相同,將不會發出來,若後一個元素和前一個元素不同才會被發出來。 let disposeBag = DisposeBag() Observable.of("🐱", "🐷", "🐱", "🐱", "🐱", "🐵", "🐱") .distinctUntilChanged() .subscribe(onNext: { print($0) }) .disposed(by: disposeBag) 印出結果 🐱 🐷 🐱 🐵 🐱

2022-02-14 17:35 · 1 min · Tientien

RxSwift - combineLatest、skip、do

combineLatest 將多個 Observables 中最新的元素透過一個函數組合起來,然後將結果發出來。 let disposeBag = DisposeBag() let first = PublishSubject<String>() let second = PublishSubject<String>() Observable.combineLatest(first, second) { $0 + $1 } .dubscribe(onNext: { print($0) }) .disposed(by: disposeBag) first.onNext("1") second.onNext("A") first.onNext("2") second.onNext("B") second.onNext("C") second.onNext("D") first.onNext("3") first.onNext("4") 印出結果 1A 2A 2B 2C 2D 3D 4D skip 跳過 Observable 中頭 n 個元素 do 使用 do 來監聽事件的生命週期,它會在每一次事件發送前被調用。 它和 subscribe 一樣,可以通過不同的閉包回調不同類型的事件。 如:do(onNext: ) 在 subscribe(onNext:) 前,do(onCompleted:) 在 subscribe(onCompleted:) 前調用。 let observable = Observable....

2022-02-13 17:35 · 1 min · Tientien

SwiftUI - ObservableObject

ObservableObject 和 @ObservedObject ObservableObject 是一個 protocol,要求實現協議的類型為 class,有一個需要實作的屬性 objectWillChange。 當數據將要發生改變時,這個屬性用來向外進行「廣播」,它的訂閱者(一般是 View 相關的邏輯)在收到通知後,對 View 進行刷新。 創建遵從 ObservableObject 協議的類別後,實際在 View 裡使用需要將此物件宣告為 @ObservedObject。 範例:點擊按鈕擲骰子 使用 PassthroughSubject 中 send() 方法通知事件將要發生。 PassthroughSubject 於 Combine 框架中,將於後續介紹。 ContentView 中 model 為 reference type,使用 @ObservedObject 將它和 ContentView 關聯起來。當 model 中的屬性 diceState 將要改變,objectWillChange 就會發出事件,使得 body 被調用進行UI刷新。 struct ContentView: View { @ObservedObject private var model = DiceModel() var body: some View { CounterButton(diceState: $model.diceState) } } class DiceModel: ObservableObject { let objectWillChange = PassthroughSubject<Void, Never>() var diceState: DiceState = ....

2022-02-06 18:00 · 2 min · Tientien