ios - @Published 属性在用作导航栏的标题时有延迟
问题描述
我刚刚注意到,当使用@Published
属性作为导航的标题时,显示值时会有一些延迟(但如果在 ViewModel 的初始化上进行订阅,它会立即显示),而且延迟仅在导航栏上,因为Text
视图立即显示值:
class ContentViewModel: ObservableObject {
@Published var text: String = ""
private var cancellables = Set<AnyCancellable>()
func onAppear() {
Just("onAppear text")
.sink { [weak self] in
self?.text = $0
}
.store(in: &cancellables)
}
}
struct ContentView: View {
@ObservedObject var viewModel: ContentViewModel
var body: some View {
Text(viewModel.text)
.padding()
.navigationTitle(viewModel.text)
.onAppear(perform: viewModel.onAppear)
}
}
struct MainView: View {
@StateObject var viewModel = ContentViewModel()
var body: some View {
NavigationView {
NavigationLink("Open View") {
ContentView(viewModel: viewModel)
}
}
}
}
注意:使用工具栏还可以立即显示标题:
.toolbar(content: {
ToolbarItemGroup(placement: .principal) {
Text(viewModel.text)
.fixedSize()
}
})
注意:但我对工具栏的小缺点是文本没有被截断,如果我有一个长文本(因为在我的真实应用程序中可以是动态的)溢出并显示在前导/尾随按钮下方。可能与fixedSize()
(但如果我不申请,视图不可见,看起来没有正确的布局更新)
解决方案
实际上存在滞后,但您可以使用 init 而不是 onAppear 来加载人员:
class ContentViewModel: ObservableObject {
@Published var text: String = ""
private var cancellables = Set<AnyCancellable>()
init() { // THIS
Just("onAppear text")
.sink { [weak self] in
self?.text = $0
}
.store(in: &cancellables)
}
}
struct TheView: View {
@ObservedObject var viewModel: ContentViewModel
var body: some View {
Text(viewModel.text)
.padding()
.navigationTitle(viewModel.text)
//.onAppear(perform: viewModel.onAppear) THIS
}
}
推荐阅读
- postgresql - Hasura 查询在生产 Heroku 服务器上超时,但在 Heroku 登台服务器上快如闪电
- vue.js - Socket-IO 使用 Polling 而不是 Websocket
- c++ - 一旦输入了一个合数,涉及计算素数的代码就会停止工作。C++
- python-xarray - Xarray:切片坐标返回一个空维度
- python - 使用 aws cli 或 python 从 ec2 实例中删除安全组
- postman - 如何在 Postman 中创建 SAS 令牌以与服务总线一起使用?
- javascript - Angular 7+:如何从 api 端点静默实现刷新?
- c# - C# 逻辑问题使用相同的输入进入错误的循环
- android - Android YouTube 播放器直播
- javascript - 使用 getDerivedStateFromProps 生命周期方法时如何正确返回更新状态?