.sheet我在使用 SwiftUI 时遇到了内容更改时出现的问题List。我来详细说明一下情况。
我在 Github 上提供了一个示例,您可以克隆该示例,以便轻松重现该错误。
我只有两种观点:
PlaylistCreationViewSearchView他们每个人都有各自的视图模型,称为PlaylistCreationViewModel和SearchViewModel。
有PlaylistCreationView一个Add Songs按钮女巫将呈现SearchView有一个sheet。当用户触摸搜索结果中的歌曲时,系统SearchView会发送一个onAddSong完成处理程序,通知PlaylistCreationView歌曲已添加。
这是情况的简单示意图:
这里还有一些视图的屏幕截图:
当用户触摸 中的歌曲时SearchView,SearchView内容会重新绘制。我的意思是视图被重新创建。如果该视图是第一次加载,则会出现该视图。像这样:
为了简化问题,这是情况的另一种模式:
以下是我在触摸一首歌后可以观察到的情况:
如您所见,歌曲已正确添加到播放列表中,但SearchView现在为空白,因为它已被重新创建。
我无法解释的是,为什么更改列表中的列表会PlaylistCreationViewModel导致重新绘制所呈现的sheet.
我在 Github 上提供了一个示例,您可以克隆它。要重现该问题:
final class PlaylistCreationViewModel: ObservableObject {
@Published var sheetType: SheetType? …Run Code Online (Sandbox Code Playgroud) 我正在使用 WWDC 2023 上推出的带有 SwiftUI 的最新观察框架。似乎新的@Environment属性包装器不允许使用协议。我的服务实现如下所示:
protocol UserServiceRepresentation {
var user: User { get }
}
// Service implementation
@Observable
final class UserService: UserServiceRepresentable {
private(set) var user: User
func fetchUser() async { ... }
}
// Service mock
@Observable
final class UserServiceMock: UserServiceRepresentable {
let user: User = .mock
}
Run Code Online (Sandbox Code Playgroud)
以前,可以使用@EnvironmentObject声明协议,以便您可以将模拟服务作为环境对象传递给视图。
struct UserView: View {
// This is possible using EnvironmentObject.
// But it require UserService to conforms to ObservableObject.
@EnvironmentObject private var userService: UserService …Run Code Online (Sandbox Code Playgroud)