小编bpi*_*ano的帖子

SwiftUI 列表重绘所呈现工作表的内容

.sheet我在使用 SwiftUI 时遇到了内容更改时出现的问题List。我来详细说明一下情况。

在 Github 上提供了一个示例,您可以克隆该示例,以便轻松重现该错误。

语境


我只有两种观点:

  • PlaylistCreationView
  • SearchView

他们每个人都有各自的视图模型,称为PlaylistCreationViewModelSearchViewModel

PlaylistCreationView一个Add Songs按钮女巫将呈现SearchView有一个sheet。当用户触摸搜索结果中的歌曲时,系统SearchView会发送一个onAddSong完成处理程序,通知PlaylistCreationView歌曲已添加。

这是情况的简单示意图:

情况

这里还有一些视图的屏幕截图:

播放列表创建视图

播放列表创建视图

搜索视图

搜索视图

问题

当用户触摸 中的歌曲时SearchViewSearchView内容会重新绘制。我的意思是视图被重新创建。如果该视图是第一次加载,则会出现该视图。像这样:

空白搜索

为了简化问题,这是情况的另一种模式:

问题图式

以下是我在触摸一首歌后可以观察到的情况:

在此输入图像描述

如您所见,歌曲已正确添加到播放列表中,但SearchView现在为空白,因为它已被重新创建。

我无法解释的是,为什么更改列表中的列表会PlaylistCreationViewModel导致重新绘制所呈现的sheet.

如何重现问题


在 Github 上提供了一个示例,您可以克隆它。要重现该问题:

  1. 克隆该项目并在任何 iPhone 模拟器上运行它。
  2. 触摸“添加歌曲”。
  3. 在搜索视图顶部的搜索栏中输入内容。
  4. 选择一首歌曲。您的搜索应该已经消失,因为视图已被重建。

代码


播放列表创建视图模型

final class PlaylistCreationViewModel: ObservableObject {
    
    @Published var sheetType: SheetType? …
Run Code Online (Sandbox Code Playgroud)

ios swift swiftui swiftui-list

6
推荐指数
1
解决办法
1065
查看次数

在 SwiftUI 中使用带有最新 @Environment 的协议

我正在使用 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)

swift swiftui swiftui-environment

2
推荐指数
1
解决办法
388
查看次数

标签 统计

swift ×2

swiftui ×2

ios ×1

swiftui-environment ×1

swiftui-list ×1