Post

Replies

Boosts

Views

Activity

Reply to @StateObject for view owning "viewModel" to use with @Observable observation framework object
Even though Apple migration guide suggests to use @State I noticed this behavior too as I'm used to have a sort of MVVM in SwiftUI. So I tried a mixed approach; I used a sort of wrapper which is both Observable and a @StateObject just for the sake of the lifetime, no @Published var within it. @Observable public final class Store<VM: Observable & AnyObject>: ObservableObject { private var _viewModel: VM public var viewModel: VM { get { _viewModel } set {} // set ignored } deinit { print("Deinit", self) } init(_ viewModel: @escaping () -> VM) { _viewModel = viewModel() } } import SwiftUI extension StateObject { public init<ViewModel: Observable & AnyObject>( viewModel: @escaping @autoclosure () -> ViewModel ) where ObjectType == Store<ViewModel> { self.init(wrappedValue: .init(viewModel)) } } Then in the view @StateObject private var store: Store<MyViewModel> init(someInitialValue: String) { _store = .init(viewModel: .init(value: someInitialValue)) } var body: some View { Text(store.viewModel.value) TextField(text: $store.viewModel.editableText) } Did you find any other solution?
Topic: UI Frameworks SubTopic: SwiftUI Tags:
Jun ’24
Reply to Swift build tool plugin unable to write to pluginWorkDirectory using Xcode Cloud
After months of fighting with permission on Xcode Cloud, by chance I found what was the issue on my case! In my plugin implementation I write the file through """ // auto generated swift file // ... the content """.write(to: output, atomically: true, encoding: .utf8) Using atomically: true is the issue: this means that swift writes the entire content into a temporary file placed somewhere else and Xcode Cloud doesn't have permission in this moment! Using atomically: false the file is written directly into our output file, which is the context.pluginWorkDirectory.appending("GeneratedImageAssets.swift") and permissions here hare granted!!
Jan ’24
Reply to Closure with typed throws stored as a View property crashes on iOS 17
@DTS Engineer create a bug report with ID: FB16527158
Topic: UI Frameworks SubTopic: SwiftUI Tags:
Replies
Boosts
Views
Activity
Feb ’25
Reply to @StateObject for view owning "viewModel" to use with @Observable observation framework object
Even though Apple migration guide suggests to use @State I noticed this behavior too as I'm used to have a sort of MVVM in SwiftUI. So I tried a mixed approach; I used a sort of wrapper which is both Observable and a @StateObject just for the sake of the lifetime, no @Published var within it. @Observable public final class Store<VM: Observable & AnyObject>: ObservableObject { private var _viewModel: VM public var viewModel: VM { get { _viewModel } set {} // set ignored } deinit { print("Deinit", self) } init(_ viewModel: @escaping () -> VM) { _viewModel = viewModel() } } import SwiftUI extension StateObject { public init<ViewModel: Observable & AnyObject>( viewModel: @escaping @autoclosure () -> ViewModel ) where ObjectType == Store<ViewModel> { self.init(wrappedValue: .init(viewModel)) } } Then in the view @StateObject private var store: Store<MyViewModel> init(someInitialValue: String) { _store = .init(viewModel: .init(value: someInitialValue)) } var body: some View { Text(store.viewModel.value) TextField(text: $store.viewModel.editableText) } Did you find any other solution?
Topic: UI Frameworks SubTopic: SwiftUI Tags:
Replies
Boosts
Views
Activity
Jun ’24
Reply to Swift build tool plugin unable to write to pluginWorkDirectory using Xcode Cloud
After months of fighting with permission on Xcode Cloud, by chance I found what was the issue on my case! In my plugin implementation I write the file through """ // auto generated swift file // ... the content """.write(to: output, atomically: true, encoding: .utf8) Using atomically: true is the issue: this means that swift writes the entire content into a temporary file placed somewhere else and Xcode Cloud doesn't have permission in this moment! Using atomically: false the file is written directly into our output file, which is the context.pluginWorkDirectory.appending("GeneratedImageAssets.swift") and permissions here hare granted!!
Replies
Boosts
Views
Activity
Jan ’24