目前分類:iOS (234)
- Oct 31 Thu 2024 10:37
[SwiftUI] 客製ScrollView下拉更新 pull to refresh
- Oct 17 Thu 2024 08:27
[SwiftUI] Admob 消失門(誤) 之解法
- Sep 26 Thu 2024 23:54
[Xcode 16] pod install 失敗
建資料夾Xcode 16將預設改成folder(以前是group),
這會導致 pod install 失敗,
- Sep 18 Wed 2024 21:21
[SwiftUI] Xcode 16 preview失敗解法
(1.Xcode 16 Editor > Canvas > Use Legacy Previews Execution)
- Jul 24 Wed 2024 22:17
[Swift] 調整文字大小後,WKWebView變白
- Apr 21 Sun 2024 21:44
[Swift] map, compactMap平行處理
記錄很讚的文章
- Sep 25 Mon 2023 20:31
[Swift] Custom property wrapper for Decodable
- Aug 28 Mon 2023 15:08
[iOS] Appium 2.1.3 環境設定
- Jun 26 Mon 2023 13:09
[xcodebuild] 點2下打包ad-hoc, appstore ipa
- Mar 18 Sat 2023 21:36
[Swift] Custom Encoder
- Dec 31 Sat 2022 22:46
[Objective-C] OC的PromiseKit運用
- May 17 Tue 2022 12:23
[SwiftUI] @State sync UserDefaults
泛型條件約束的Auto sync UserDefaults with Enum key SwiftUI property wrapper
- May 12 Thu 2022 15:54
[Swift] 學習資源
Swift 初見 (Swift 2)
- May 11 Wed 2022 17:19
[SwiftUI] Binding converter (類windows phone style)
建立類似Windows Phone的雙向綁定型態轉換器(IValueConverter),
並搭配extension來實現預設實作,再建DateToStringConverter。
在使用的時候,
TextField("test", text: $enterDate.convert(converter: dateToStringConverter), prompt: Text("請輸入"))
extension Binding {
func convert(converter: T) -> Binding where T: IValueConverter,
Value == T.Source {
return Binding {
return converter.convert(value: self.wrappedValue)
} set: { (value: T.Target) in
do {
self.wrappedValue = try converter.convertBack(value: value)
} catch {
print(String(describing: error))
}
}
}
}
protocol IValueConverter {
associatedtype Source
associatedtype Target
associatedtype Parameter
var parameter: Parameter { get }
func convert(value: Source) -> Target
func convertBack(value: Target) throws -> Source
}
struct DateToStringConverter: IValueConverter {
typealias Source = Date?
typealias Target = String
typealias Parameter = String
let parameter: Parameter
init(parameter: Parameter) {
self.parameter = parameter
}
func convert(value: Source) -> Target {
return value?.toString(format: parameter) ?? ""
}
func convertBack(value: Target) throws -> Source {
guard let value = value.toDate(format: parameter) else {
throw NSError(domain: "Can't cast from \(Source.self) to \(Target.self)", code: -1)
}
return value
}
}
- Apr 14 Thu 2022 22:01
[OC & Swift 混編] NavigationParameter
- Feb 26 Sat 2022 20:47
[Objective-C] 柯里化 Curring 寫法
- Sep 28 Tue 2021 03:01
[Swift 5.5] Combine for UIKit with async / await
ViewModel:
import WebAPI
import MVVM
final class Page2ViewModel: ObservableObject, Refreshable, Updateable {
@Published var isUpdate: Bool = false
@Published private(set) var cellViewModels: [Page2CellViewModel] = []
@Published private(set) var model: MainApodModel? {
didSet {
guard let model = model else {
return
}
cellViewModels = model.result.map { Page2CellViewModel(model: $0) }
}
}
func refresh() {
isUpdate = true
let parameter = MainApodParameter()
Task { @MainActor in
do {
let model: MainApodModel = try await MainApodWebAPI().invokeAsync(parameter)
isUpdate = false
self.model = model
} catch let error {
print(error.localizedDescription)
isUpdate = false
}
}
}
}
ViewController:
- Sep 27 Mon 2021 00:51
[Swift 5.5] async / await 搭配 Value types MVVM
import WebAPI
import MVVM
struct Page2ViewModel: Refreshable, Updateable, MutatingClosure {
weak var binder: Binder?
var isUpdate: Bool = false
private(set) var cellViewModels: [Page2CellViewModel] = []
private(set) var model: MainApodModel? {
didSet {
guard let model = model else {
return
}
cellViewModels = model.result.map { Page2CellViewModel(model: $0) }
}
}
init(binder: Binder)
{
self.binder = binder
refresh()
}
mutating func refresh() {
isUpdate = true
let parameter = MainApodParameter()
let copySelf = self
Task { @MainActor in
do {
let model: MainApodModel = try await MainApodWebAPI().invokeAsync(parameter)
copySelf.mutating { (mutatingSelf: inout Page2ViewModel) in
mutatingSelf.isUpdate = false
mutatingSelf.model = model
}
} catch let error {
print(error.localizedDescription)
copySelf.mutating { (mutatingSelf: inout Page2ViewModel) in
mutatingSelf.isUpdate = false
}
}
}
}
}
await之後是callback,這樣想就可以跟之前的做法接起來
- Sep 14 Tue 2021 23:51
[SwiftUI] 顯示/隱藏 view
- Sep 01 Wed 2021 01:02
Google Play & AppStore apps Privacy policy