you can‘t use .searchable and .refreshable together, Otherwise, a memory leak may occur,use weak can fix this
import SwiftUI
import Observation
struct ContentView: View {
@State var path: String = ""
var body: some View {
NavigationStack {
VStack {
NavigationLink(value: "new") {
Text("Hello, world!")
}
}
.navigationDestination(for: String.self) { _ in
SubContentView()
}
}
}
}
struct SubContentView: View {
@State private var viewModel: TestViewModel = TestViewModel(someString: "some string")
@State private var searchText: String = ""
var body: some View {
ScrollView {
LazyVStack {
Text("\(viewModel.someString)")
}
}
.searchable(text: $searchText) // 删除searchable 后 viewModel 可以正常执行
.refreshable {
viewModel.someString = "sadsadsa"
}
// .refreshable { [weak viewModel] in ✅
// // 同时使用refreshable 和 searchable 的情况下,viewModel必须weak 处理,否则会没法deinit
// viewModel?.someString = "sadsadsa"
// }
.padding()
}
}
@Observable
class TestViewModel {
var someString: String = "some string"
init(someString: String) {
self.someString = someString
print("init")
}
deinit {
print("deinit")
}
}
Topic:
UI Frameworks
SubTopic:
SwiftUI
Tags: