swiftui - 使用 SwiftUI List()、ForEach()、.onTapGesture WatchOS 6 传递值时出现问题

标签 swiftui xcode11 watchos-6

我正在尝试使用 .onTapGesture() 调用点击 View 上的方法并传递某种 ID 或任何其他形式的标识符,但我不知道如何操作。

我有一个 View ListView,它是根据从数组 trackPreviewList: [TrackpreviewList] 获取的数据创建的。

View 如下所示:

struct ListView: View {
    @ObservedObject var model: PlaybackService
    @State var list = PlaybackService.sharedInstance.trackPreviewList

var body: some View {
        List {
            Section(header: Text("Songs")) {
                ForEach(model.trackPreviewList!, id: \.id) {
                    Text($0.artistName + ": " + $0.name)
                 }
                    .onDelete(perform: deleteTrack)
                    .onTapGesture(perform: skipTo)
            }
        }
    }

我对 SwiftUI 和编码非常陌生,但我认为正确的方法是说 cell(view?) 2 被点击,因此将 2 传递给方法 func playerSkipTo(skipToIndex: Int) 我尝试像这样对值 2 进行硬编码,它适用于硬编码值:

enter image description here

虽然我对如何传递某种标识符一无所知,但我认为我的问题是我试图访问方法“知道它”的范围之外的对象。 我尝试使用 $0.name 变量只是为了看看我是否可以传递任何内容,但我收到此错误上下文闭包类型'() -> Void'需要0个参数,但在闭包主体中使用了1个 我认为这是因为 .onTapGesture() 方法没有闭包?

我尝试使用与使用 IndexSet 的 .onDelete() 方法相同的逻辑,如下所示: enter image description here

我最终想要将值传递给的方法如下所示:

func playerSkipTo(skipToIndex: Int) {
        if skipToIndex < ((trackPreviewList!.underestimatedCount)-1) {
            _ = firstly {
                TracklistProvider.sharedInstance.getPlaybackURL(trackPreview: trackPreviewList![skipToIndex])
            }.map { playbackoptions in
                self.createPlayerItemFromLink(assetURL: (playbackoptions?.playbackUrl)!)
            }.done{
                self.replacePlayerItem()
            }
        } else {
            print("The index \(skipToIndex) is out of bounds")
        }
    }

我知道我需要更改 playerSkipTo() 方法来接受 IndexSet,我也尝试过使用它,尝试将其转换为 Int 等。

非常感谢任何帮助或指示!

Heres the playerSkipTo method:

        if skipToIndex < ((trackPreviewList!.underestimatedCount)-1) {
            _ = firstly {
                TracklistProvider.sharedInstance.getPlaybackURL(trackPreview: trackPreviewList![skipToIndex])
            }.map { playbackoptions in
                self.createPlayerItemFromLink(assetURL: (playbackoptions?.playbackUrl)!)
            }.done{
                self.replacePlayerItem()
            }
        } else {
            print("The index \(skipToIndex) is out of bounds")
        }
    }

最佳答案

不要跳到索引,而是跳到特定的跟踪对象:

func playerSkipTo(_ playbackoptions: PlaybackOptions) {
   // ...
}

然后更改您的 View 代码以在 Text 而不是 ForEach 上调用此函数:

List {
    Section(header: Text("Songs")) {
        ForEach(model.trackPreviewList!, id: \.id) {
            Text($0.artistName + ": " + $0.name)
                .onTapGesture {
                    self.playerSkipTo($0)
                }
        }
    }
}

关于swiftui - 使用 SwiftUI List()、ForEach()、.onTapGesture WatchOS 6 传递值时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59411447/

相关文章:

ios - 如何在swiftUI中显示登录 View 后的 View

ios - 是否可以在 iOS 14 WidgetKit 中动态更新/更改布局(例如 View 数量)?

Xcode11 编辑器(通过 "Add Editor to Right")被禁用

ios - SwiftUI HStack slider 不出现

ios - 剪裁时使 SwiftUI 点击不会超出边界

swift - 是否有任何提交催化剂应用程序的指南?

ios - SwiftUI 中带循环的动态按钮

ios - watchOS上带有CloudKit的CoreData不同步

core-data - 在独立的 watchOS 应用上实现核心数据

ios - Apple WatchO和Firebase Cloud Messaging一起提供推送通知